# Cai dat cac thu vien can thiet
There were 23 warnings (use warnings() to see them)
# install.packages("moments")
# install.packages("dplyr")
# install.packages("readxl")
# install.packages("ggplot2)
# install.packages("hrbrthemes")
# Load cac thu vien can thiet
library(moments) # Dung de thuc hien cac fucntion Statistics
library(dplyr) # Dung de lam viec voi cac Dataframe
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(readxl) # Dung de doc file Excel
library(xlsx)
library(ggplot2) # Dung de ve do thi
library(gridExtra) # Dung de dan layout cho cac plot
Attaching package: ‘gridExtra’
The following object is masked from ‘package:dplyr’:
combine
library(grid)
library(hrbrthemes) # Dung de load theme cho cac plot
NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
library(ggpubr)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
# Tao dataframe Giua ky tu trich xuat file Excel - sheet "GK"
dataGK <- read_excel("192_CO1007.xlsx", sheet = "GK", skip = 4)
dataGK[!complete.cases(dataGK),]
# Tao dataframe Cuoi ky tu trich xuat file Excel - sheet "CK"
dataCK <- read_excel("192_CO1007.xlsx", sheet = "CK", skip = 4)
# Hien thi dataframe Giua ky
dataGK
# Hien thi dataframe Cuoi ky
dataCK
# Ket qua cham thi Giua ky
KetQuaGK <- dataGK[, c("No", "MANH", "TO", "MADE", "1":"25")]
KetQuaGK
# Bai thi cua Sinh vien Giua ky
# Boi vi trong BaiThiGK co nhung cau Sinh vien bo trong (value = NA), nen chung ta se khong the goi nhu tren
BaiThiGK <- dataGK[, c(1, 2, 3, 29:54)]
BaiThiGK
# Ket qua cham thi Cuoi ky
KetQuaCK <- dataCK[, c("No", "MANH", "TO", "MADE", "1":"29")]
KetQuaCK
# Bai thi cua Sinh vien Cuoi ky
# Tuong tu nhu BaiThiGK
BaiThiCK <- dataCK[, c(1, 2, 3, 33:62)]
BaiThiCK
# Dung dplyr to cong So cau dung va So cau sai cua tung Sinh vien
# Tao Bang So dap an dung va sai cua sinh vien Giua ky
SoCauDungVaSaiCuaSVGK <- KetQuaGK %>% rowwise() %>%
mutate(
SoCauDung = sum(c_across("1":"25")),
SoCauSai = 25 - sum(c_across("1":"25"))
)
# Tao Bang So dap an dung va sai cua sinh vien Cuoi ky
SoCauDungVaSaiCuaSVCK <- KetQuaCK %>% rowwise() %>%
mutate(
SoCauDung = sum(c_across("1":"29")),
SoCauSai = 29 - sum(c_across("1":"29"))
)
# In ra Tong so cau Dung trong ky thi Giua ky cua sinh vien trong tap mau
TongSoCauDungCuaSVGK = SoCauDungVaSaiCuaSVGK[, c("No", "MANH", "TO", "MADE", "SoCauDung")]
TongSoCauDungCuaSVGK
# In ra Tong so cau Dung trong ky thi Cuoi ky cua sinh vien trong tap mau
TongSoCauDungCuaSVCK = SoCauDungVaSaiCuaSVCK[, c("No", "MANH", "TO", "MADE", "SoCauDung")]
TongSoCauDungCuaSVCK
# In ra Tong so cau Sai trong ky thi Giua ky cua sinh vien trong tap mau
TongSoCauSaiCuaSVGK = SoCauDungVaSaiCuaSVGK[, c("No", "MANH", "TO", "MADE", "SoCauSai")]
TongSoCauSaiCuaSVGK
# In ra Tong so cau Sai trong ky thi Cuoi ky cua sinh vien trong tap mau
TongSoCauSaiCuaSVCK = SoCauDungVaSaiCuaSVCK[, c("No", "MANH", "TO", "MADE", "SoCauSai")]
TongSoCauSaiCuaSVCK
# Xac dinh cau dung nhieu nhat va nho nhat trong tap mau Giua ky
# Tinh ra Danh sach (List) so lan Dung cua moi cau Giua ky
SoCauDungGK <- colSums(dataGK[,c(4:28)])
CauDungNhieuNhatGK <- subset(SoCauDungGK, SoCauDungGK == max(SoCauDungGK))
CauDungItNhatGK <- subset(SoCauDungGK,SoCauDungGK == min(SoCauDungGK))
sprintf("Cau %s la cau duoc chon dung nhieu nhat Giua ky voi %s lan chon dung", names(CauDungNhieuNhatGK), CauDungNhieuNhatGK)
[1] "Cau 2 la cau duoc chon dung nhieu nhat Giua ky voi 350 lan chon dung"
sprintf("Cau %s la cau duoc chon dung it nhat Giua ky chi voi %s lan chon dung", names(CauDungItNhatGK), CauDungItNhatGK)
[1] "Cau 6 la cau duoc chon dung it nhat Giua ky chi voi 0 lan chon dung"
# Xac dinh cau dung nhieu nhat va nho nhat trong tap mau Cuoi ky
# Tinh ra Danh sach (List) so lan Dung cua moi cau Cuoi ky
SoCauDungCK <- colSums(dataCK[,c(4:32)])
CauDungNhieuNhatCK <- subset(SoCauDungCK,SoCauDungCK == max(SoCauDungCK))
CauDungItNhatCK <- subset(SoCauDungCK,SoCauDungCK == min(SoCauDungCK))
sprintf("Cau %s la cau duoc chon dung nhieu nhat Cuoi ky voi %s lan chon dung", names(CauDungNhieuNhatCK), CauDungNhieuNhatCK)
[1] "Cau 20 la cau duoc chon dung nhieu nhat Cuoi ky voi 317 lan chon dung"
sprintf("Cau %s la cau duoc chon dung it nhat Cuoi ky chi voi %s lan chon dung", names(CauDungItNhatCK), CauDungItNhatCK)
[1] "Cau 12 la cau duoc chon dung it nhat Cuoi ky chi voi 157 lan chon dung"
# Tinh So lan chon dung moi cau theo ma de Giua ky
# Tao subset tu TongSoCauDungCuaSVGK chi gom tung MADE 1921
SoCauDungGK1921 <- subset(TongSoCauDungCuaSVGK, TongSoCauDungCuaSVGK$MADE == 1921)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1921
SoLanChonDungGK1921 <- table(SoCauDungGK1921$SoCauDung)
dDungGK1921 <- data.frame(SoLanChonDungGK1921)
colnames(dDungGK1921) <- c("SoCauDung", "SoSinhVien")
pDungGK1921 <- ggplot(dDungGK1921, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="steelblue") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauDungCuaSVGK chi gom tung MADE 1922
SoCauDungGK1922 <- subset(TongSoCauDungCuaSVGK, TongSoCauDungCuaSVGK$MADE == 1922)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonDungGK1922 <- table(SoCauDungGK1922$SoCauDung)
dDungGK1922 <- data.frame(SoLanChonDungGK1922)
colnames(dDungGK1922) <- c("SoCauDung", "SoSinhVien")
pDungGK1922 <- ggplot(dDungGK1922, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="darkgoldenrod1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauDungCuaSVGK chi gom tung MADE 1923
SoCauDungGK1923 <- subset(TongSoCauDungCuaSVGK, TongSoCauDungCuaSVGK$MADE == 1923)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonDungGK1923 <- table(SoCauDungGK1923$SoCauDung)
dDungGK1923 <- data.frame(SoLanChonDungGK1923)
colnames(dDungGK1923) <- c("SoCauDung", "SoSinhVien")
pDungGK1923 <- ggplot(dDungGK1923, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="darkseagreen") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauDungCuaSVGK chi gom tung MADE 1924
SoCauDungGK1924 <- subset(TongSoCauDungCuaSVGK, TongSoCauDungCuaSVGK$MADE == 1924)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1924
SoLanChonDungGK1924 <- table(SoCauDungGK1924$SoCauDung)
dDungGK1924 <- data.frame(SoLanChonDungGK1924)
colnames(dDungGK1924) <- c("SoCauDung", "SoSinhVien")
pDungGK1924 <- ggplot(dDungGK1924, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Hien thi 4 bieu do
g <- grid.arrange(
arrangeGrob(pDungGK1921, bottom = "Đề 1921"),
arrangeGrob(pDungGK1922, bottom = "Đề 1922"),
arrangeGrob(pDungGK1923, bottom = "Đề 1923"),
arrangeGrob(pDungGK1924, bottom = "Đề 1924"),
nrow = 2,
bottom = "Tổng số các câu đúng của sinh viên theo Mã đề của tập mẫu Giữa kỳ"
)

# Luu hinh anh vao thu muc hinh
ggsave("hinh/5241_tongsocaudung_gk.jpg", g)
Saving 10 x 10 in image
# Tinh So lan chon dung moi cau theo ma de Cuoi ky
# Tao subset tu TongSoCauDungCuaSVCK chi gom tung MADE 1921
SoCauDungCK1921 <- subset(TongSoCauDungCuaSVCK, TongSoCauDungCuaSVCK$MADE == 1921)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1921
SoLanChonDungCK1921 <- table(SoCauDungCK1921$SoCauDung)
dDungCK1921 <- data.frame(SoLanChonDungCK1921)
colnames(dDungCK1921) <- c("SoCauDung", "SoSinhVien")
pDungCK1921 <- ggplot(dDungCK1921, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauDungCuaSVCK chi gom tung MADE 1922
SoCauDungCK1922 <- subset(TongSoCauDungCuaSVCK, TongSoCauDungCuaSVCK$MADE == 1922)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonDungCK1922 <- table(SoCauDungCK1922$SoCauDung)
dDungCK1922 <- data.frame(SoLanChonDungCK1922)
colnames(dDungCK1922) <- c("SoCauDung", "SoSinhVien")
pDungCK1922 <- ggplot(dDungCK1922, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauDungCuaSVCK chi gom tung MADE 1923
SoCauDungCK1923 <- subset(TongSoCauDungCuaSVCK, TongSoCauDungCuaSVCK$MADE == 1923)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonDungCK1923 <- table(SoCauDungCK1923$SoCauDung)
dDungCK1923 <- data.frame(SoLanChonDungCK1923)
colnames(dDungCK1923) <- c("SoCauDung", "SoSinhVien")
pDungCK1923 <- ggplot(dDungCK1923, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauDungCuaSVCK chi gom tung MADE 1924
SoCauDungCK1924 <- subset(TongSoCauDungCuaSVCK, TongSoCauDungCuaSVCK$MADE == 1924)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1924
SoLanChonDungCK1924 <- table(SoCauDungCK1924$SoCauDung)
dDungCK1924 <- data.frame(SoLanChonDungCK1924)
colnames(dDungCK1924) <- c("SoCauDung", "SoSinhVien")
pDungCK1924 <- ggplot(dDungCK1924, aes(x=SoCauDung, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Hien thi 4 bieu do
g <- grid.arrange(
arrangeGrob(pDungGK1921, bottom = "Đề 1921"),
arrangeGrob(pDungGK1922, bottom = "Đề 1922"),
arrangeGrob(pDungGK1923, bottom = "Đề 1923"),
arrangeGrob(pDungGK1924, bottom = "Đề 1924"),
nrow = 2,
bottom = "Tổng số các câu đúng của sinh viên theo Mã đề của tập mẫu Cuối kỳ"
)

# Luu hinh anh vao thu muc hinh
ggsave("hinh/5242_tongsocaudung_ck.jpg", g)
Saving 10 x 10 in image
# Tinh So lan chon sai moi cau theo ma de Giua ky
# Tao subset tu TongSoCauSaiCuaSVGK chi gom tung MADE 1921
SoCauSaiGK1921 <- subset(TongSoCauSaiCuaSVGK, TongSoCauSaiCuaSVGK$MADE == 1921)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1921
SoLanChonSaiGK1921 <- table(SoCauSaiGK1921$SoCauSai)
dSaiGK1921 <- data.frame(SoLanChonSaiGK1921)
colnames(dSaiGK1921) <- c("SoCauSai", "SoSinhVien")
pSaiGK1921 <- ggplot(dSaiGK1921, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauSaiCuaSVGK chi gom tung MADE 1922
SoCauSaiGK1922 <- subset(TongSoCauSaiCuaSVGK, TongSoCauSaiCuaSVGK$MADE == 1922)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonSaiGK1922 <- table(SoCauSaiGK1922$SoCauSai)
dSaiGK1922 <- data.frame(SoLanChonSaiGK1922)
colnames(dSaiGK1922) <- c("SoCauSai", "SoSinhVien")
pSaiGK1922 <- ggplot(dSaiGK1922, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauSaiCuaSVGK chi gom tung MADE 1923
SoCauSaiGK1923 <- subset(TongSoCauSaiCuaSVGK, TongSoCauSaiCuaSVGK$MADE == 1923)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonSaiGK1923 <- table(SoCauSaiGK1923$SoCauSai)
dSaiGK1923 <- data.frame(SoLanChonSaiGK1923)
colnames(dSaiGK1923) <- c("SoCauSai", "SoSinhVien")
pSaiGK1923 <- ggplot(dSaiGK1923, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauSaiCuaSVGK chi gom tung MADE 1924
SoCauSaiGK1924 <- subset(TongSoCauSaiCuaSVGK, TongSoCauSaiCuaSVGK$MADE == 1924)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1924
SoLanChonSaiGK1924 <- table(SoCauSaiGK1924$SoCauSai)
dSaiGK1924 <- data.frame(SoLanChonSaiGK1924)
colnames(dSaiGK1924) <- c("SoCauSai", "SoSinhVien")
pSaiGK1924 <- ggplot(dSaiGK1924, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Hien thi 4 bieu do
g <- grid.arrange(
arrangeGrob(pDungGK1921, bottom = "Đề 1921"),
arrangeGrob(pDungGK1922, bottom = "Đề 1922"),
arrangeGrob(pDungGK1923, bottom = "Đề 1923"),
arrangeGrob(pDungGK1924, bottom = "Đề 1924"),
nrow = 2,
bottom = "Tổng số các câu đúng của sinh viên theo Mã đề của tập mẫu Giữa kỳ"
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/5243_tongsocausai_gk.jpg", g)
# Tinh So lan chon sai moi cau theo ma de Cuoi ky
# Tao subset tu TongSoCauSaiCuaSVCK chi gom tung MADE 1921
SoCauSaiCK1921 <- subset(TongSoCauSaiCuaSVCK, TongSoCauSaiCuaSVCK$MADE == 1921)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1921
SoLanChonSaiCK1921 <- table(SoCauSaiCK1921$SoCauSai)
dSaiCK1921 <- data.frame(SoLanChonSaiCK1921)
colnames(dSaiCK1921) <- c("SoCauSai", "SoSinhVien")
pSaiCK1921 <- ggplot(dSaiCK1921, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauSaiCuaSVCK chi gom tung MADE 1922
SoCauSaiCK1922 <- subset(TongSoCauSaiCuaSVCK, TongSoCauSaiCuaSVCK$MADE == 1922)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonSaiCK1922 <- table(SoCauSaiCK1922$SoCauSai)
dSaiCK1922 <- data.frame(SoLanChonSaiCK1922)
colnames(dSaiCK1922) <- c("SoCauSai", "SoSinhVien")
pSaiCK1922 <- ggplot(dSaiCK1922, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauSaiCuaSVCK chi gom tung MADE 1923
SoCauSaiCK1923 <- subset(TongSoCauSaiCuaSVCK, TongSoCauSaiCuaSVCK$MADE == 1923)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1922
SoLanChonSaiCK1923 <- table(SoCauSaiCK1923$SoCauSai)
dSaiCK1923 <- data.frame(SoLanChonSaiCK1923)
colnames(dSaiCK1923) <- c("SoCauSai", "SoSinhVien")
pSaiCK1923 <- ggplot(dSaiCK1923, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Tao subset tu TongSoCauSaiCuaSVCK chi gom tung MADE 1924
SoCauSaiCK1924 <- subset(TongSoCauSaiCuaSVCK, TongSoCauSaiCuaSVCK$MADE == 1924)
# Tao matrix 1 x n trong do n la so cau chon dung cua sinh vien the ma de 1924
SoLanChonSaiCK1924 <- table(SoCauSaiCK1924$SoCauSai)
dSaiCK1924 <- data.frame(SoLanChonSaiCK1924)
colnames(dSaiCK1924) <- c("SoCauSai", "SoSinhVien")
pSaiCK1924 <- ggplot(dSaiCK1924, aes(x=SoCauSai, y=SoSinhVien)) + geom_bar(stat="identity", fill="coral1") + geom_text(aes(label = SoSinhVien, y = SoSinhVien), size = 3.5, vjust = 1.6)
# Hien thi 4 bieu do
g <- grid.arrange(
arrangeGrob(pDungGK1921, bottom = "Đề 1921"),
arrangeGrob(pDungGK1922, bottom = "Đề 1922"),
arrangeGrob(pDungGK1923, bottom = "Đề 1923"),
arrangeGrob(pDungGK1924, bottom = "Đề 1924"),
nrow = 2,
bottom = "Tổng số các câu đúng của sinh viên theo Mã đề của tập mẫu Cuối kỳ"
)

# Luu hinh anh vao thu muc hinh
ggsave("hinh/5244_tongsocausai_ck.jpg", g)
Saving 10 x 10 in image
Phan III
# Tinh diem cua moi sinh vien trong ky thi Giua ky va Cuoi ky
dataGK$TongDiemGK = (round(rowSums(dataGK[,c(4:28)])/25*10,1))
dataCK$TongDiemCK = (round(rowSums(dataCK[,c(4:32)])/29*10,1))
# Tao ra 1 table moi chi gom 2 cot No & TongDiemGK/TongDiemCK
DiemCuaMoiSVGK<- select(dataGK,No,TongDiemGK)
DiemCuaMoiSVCK<- select(dataCK,No,TongDiemCK)
# Theme cho table
thm <- ttheme_minimal(
core=list(bg_params = list(fill = blues9[1:4], col=NA),
fg_params=list(fontface=3)),
colhead=list(fg_params=list(col="navyblue", fontface=4L)),
rowhead=list(fg_params=list(col="orange", fontface=3L)))
# Dan 2 table diem Giua ky va Cuoi ky
g <- grid.arrange(
tableGrob(head(DiemCuaMoiSVGK, 10), theme = thm),
tableGrob(head(DiemCuaMoiSVCK, 10), theme = thm),
ncol=2
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/5311_diem.jpg", g)
# Tao 1 bang moi bang cach join 2 bang DiemCuaMoiSVCK & DiemCuaMoiSVGK
DiemTongKet<-full_join(DiemCuaMoiSVCK,DiemCuaMoiSVGK)
Joining, by = "No"
DiemTongKet$TongKet = round(((rowSums(DiemTongKet[,c(2:2)])*0.6 +
rowSums(DiemTongKet[,c(3:3)])*0.4)),1)
DiemTongKet
# Theme cho table
thm <- ttheme_minimal(
core=list(bg_params = list(fill = blues9[1:4], col=NA),
fg_params=list(fontface=3)),
colhead=list(fg_params=list(col="navyblue", fontface=4L)),
rowhead=list(fg_params=list(col="orange", fontface=3L)))
# Dan 2 table diem Giua ky va Cuoi ky
g <- grid.arrange(
tableGrob(head(DiemTongKet, 10), theme = thm),
ncol=1
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/5321_diem.jpg", g)
# Tinh Trung vi mau, Cuc dai mau, Cuc tieu mau cua ky thi Giua ky
TrungViMauGK <- round(median(dataGK$TongDiemGK), 2)
CucDaiMauGK <- round(max(dataGK$TongDiemGK), 2)
CucTieuMauGK <- round(min(dataGK$TongDiemGK), 2)
# Tinh Trung vi mau, Cuc dai mau, Cuc tieu mau cua ky thi Giua ky
TrungViMauCK <- round(median(dataCK$TongDiemCK), 2)
CucDaiMauCK <- round(max(dataCK$TongDiemCK), 2)
CucTieuMauCK <- round(min(dataCK$TongDiemCK), 2)
# Tao 1 dataframe de plot table
df <- data.frame(
row.names = c("Giua ky", "Cuoi ky"),
TrungViMau = c(TrungViMauGK, TrungViMauCK),
CucDaiMau = c(CucDaiMauGK, CucDaiMauCK),
CucTieuMau = c(CucTieuMauGK, CucTieuMauCK)
)
# Theme cho table
thm <- ttheme_minimal(
core=list(bg_params = list(fill = blues9[1:4], col=NA),
fg_params=list(fontface=3)),
colhead=list(fg_params=list(col="navyblue", fontface=4L)),
rowhead=list(fg_params=list(col="orange", fontface=3L)))
# Dan 2 table diem Giua ky va Cuoi ky
g <- grid.arrange(
tableGrob(df, theme = thm),
ncol=1
)

# Luu hinh anh vao thu muc hinh
ggsave("hinh/5311_medianmaxmin.jpg", g)
Saving 7.05 x 4.36 in image
# Dung subset de loai cac gia tri co N/A
SinhVienCoDiemGKLonHonBang9 <- nrow(subset(DiemTongKet, TongDiemGK >= 9))
SinhVienCoDiemCKLonHonBang9 <- nrow(subset(DiemTongKet, TongDiemCK >= 9))
sprintf("So sinh vien co diem Giua ky lon hon hoac bang 9 la %s", SinhVienCoDiemGKLonHonBang9)
[1] "So sinh vien co diem Giua ky lon hon hoac bang 9 la 0"
sprintf("So sinh vien co diem Cuoi ky lon hon hoac bang 9 la %s", SinhVienCoDiemCKLonHonBang9)
[1] "So sinh vien co diem Cuoi ky lon hon hoac bang 9 la 5"
SinhVienCoDiemGKLonHonBang7 <- nrow(subset(DiemTongKet, TongDiemGK >= 7))
SinhVienCoDiemCKLonHonBang7 <- nrow(subset(DiemTongKet, TongDiemCK >= 7))
sprintf("So sinh vien co diem Giua ky lon hon hoac bang 7 la %s", SinhVienCoDiemGKLonHonBang7)
[1] "So sinh vien co diem Giua ky lon hon hoac bang 7 la 77"
sprintf("So sinh vien co diem Cuoi ky lon hon hoac bang 7 la %s", SinhVienCoDiemCKLonHonBang7)
[1] "So sinh vien co diem Cuoi ky lon hon hoac bang 7 la 181"
SinhVienCoDiemGKLonHonBang5 <- nrow(subset(DiemTongKet, TongDiemGK >= 5))
SinhVienCoDiemCKLonHonBang5 <- nrow(subset(DiemTongKet, TongDiemCK >= 5))
sprintf("So sinh vien co diem Giua ky lon hon hoac bang 5 la %s", SinhVienCoDiemGKLonHonBang5)
[1] "So sinh vien co diem Giua ky lon hon hoac bang 5 la 311"
sprintf("So sinh vien co diem Cuoi ky lon hon hoac bang 5 la %s", SinhVienCoDiemCKLonHonBang5)
[1] "So sinh vien co diem Cuoi ky lon hon hoac bang 5 la 322"
SinhVienCoDiemGKNhoHon5 <-nrow(subset(DiemTongKet, TongDiemGK < 5))
SinhVienCoDiemCKNhoHon5 <- nrow(subset(DiemTongKet, TongDiemCK < 5))
sprintf("So sinh vien co diem Giua ky nho hon 5 la %s", SinhVienCoDiemGKNhoHon5)
[1] "So sinh vien co diem Giua ky nho hon 5 la 55"
sprintf("So sinh vien co diem Cuoi ky nho hon 5 la %s", SinhVienCoDiemCKNhoHon5)
[1] "So sinh vien co diem Cuoi ky nho hon 5 la 39"
# Plot diem Giua ky
# Tao 1 table moi dua tren col TongDiemGK de dem so occurrence cua moi diem Giua ky
dfDemDiemGK <- data.frame(table(dataGK$TongDiemGK))
colnames(dfDemDiemGK) <- c("DiemGK", "SoSV")
plotDiemGK <- ggplot(dfDemDiemGK, aes(x=DiemGK, y=SoSV)) +
geom_line(color="grey", aes(group=1)) +
geom_point(shape=21, color="black", fill="steelblue", size=6) + theme_ipsum() +
xlab("Diem") + ylab("So Sinh vien") +
theme(panel.background=element_rect(fill="cornsilk", colour=NA)) +
geom_text(aes(label=SoSV, hjust=-1.5, vjust=0))
# Plot diem Cuoi ky
# Tao 1 table moi dua tren col TongDiemCK de dem so occurrence cua moi diem Cuoi ky
dfDemDiemCK <- data.frame(table(dataCK$TongDiemCK))
colnames(dfDemDiemCK) <- c("DiemCK", "SoSV")
plotDiemCK <- ggplot(dfDemDiemCK, aes(x=DiemCK, y=SoSV)) +
geom_line(color="grey", aes(group=1)) +
geom_point(shape=21, color="black", fill="coral1", size=6) + theme_ipsum() +
xlab("Diem") + ylab("So Sinh vien") +
theme(panel.background=element_rect(fill="cornsilk", colour=NA)) +
geom_text(aes(label=SoSV, hjust=-1.5, vjust=0))
# Hien thi 2 bieu do
g <- grid.arrange(
arrangeGrob(plotDiemGK, bottom = "Diem Giua ky"),
arrangeGrob(plotDiemCK, bottom = "Diem Cuoi ky"),
nrow = 2, ncol = 1
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/5361_plotphodiemsinhvien.jpg", g)
# Tao 1 table moi tu dataGK voi tat ca cac column va voi cac row co TongDiemGK la cao nhat
SVDiemCaoNhatGK<- select(dataGK[dataGK[,"TongDiemGK"] == max(dataGK$TongDiemGK),], No, MANH, TO,TongDiemGK)
# Tao 1 table moi tu dataCK voi tat ca cac column va voi cac row co TongDiemCK la cao nhat
SVDiemCaoNhatCK<- select(dataCK[dataCK[,"TongDiemCK"] == max(dataCK$TongDiemCK),], No, MANH, TO,TongDiemCK)
# Theme cho table
thm <- ttheme_minimal(
core=list(bg_params = list(fill = blues9[1:4], col=NA),
fg_params=list(fontface=3)),
colhead=list(fg_params=list(col="navyblue", fontface=4L)),
rowhead=list(fg_params=list(col="orange", fontface=3L)))
# Dan 2 table diem Giua ky va Cuoi ky
g <- grid.arrange(
tableGrob(head(SVDiemCaoNhatGK, 10,), theme = thm),
tableGrob(head(SVDiemCaoNhatCK, 10), theme = thm),
ncol=2, nrow=1
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/5371_diemcaonhat.jpg", g)
# Tao 1 table moi tu dataGK voi tat ca cac column va voi cac row co TongDiemGK la nho nhat
SVDiemNhoNhatGK<- select(dataGK[dataGK[,"TongDiemGK"] == min(dataGK$TongDiemGK),], No, MANH, TO,TongDiemGK)
# Tao 1 table moi tu dataGK voi tat ca cac column va voi cac row co TongDiemGK la nho nhat
SVDiemNhoNhatCK<- select(dataCK[dataCK[,"TongDiemCK"] == min(dataCK$TongDiemCK),], No, MANH, TO,TongDiemCK)
# Theme cho table
thm <- ttheme_minimal(
core=list(bg_params = list(fill = blues9[1:4], col=NA),
fg_params=list(fontface=3)),
colhead=list(fg_params=list(col="navyblue", fontface=4L)),
rowhead=list(fg_params=list(col="orange", fontface=3L)))
# Dan 2 table diem Giua ky va Cuoi ky
g <- grid.arrange(
tableGrob(head(SVDiemNhoNhatGK, 10,), theme = thm),
tableGrob(head(SVDiemNhoNhatCK, 10), theme = thm),
ncol=2, nrow=1
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/5381_diemthapnhat.jpg", g)
DiemTrungBinhGK <- round(mean(DiemCuaMoiSVGK$TongDiemGK),1)
DiemTrungBinhCK <- round(mean(DiemCuaMoiSVCK$TongDiemCK),1)
sprintf("Diem trung binh cua cac sinh vien trong tap mau Giua ky la %s", DiemTrungBinhGK)
[1] "Diem trung binh cua cac sinh vien trong tap mau Giua ky la 6.1"
sprintf("Diem trung binh cua cac sinh vien trong tap mau Cuoi ky la %s", DiemTrungBinhCK)
[1] "Diem trung binh cua cac sinh vien trong tap mau Cuoi ky la 6.8"
SVCoDiemTrungBinhGK <-nrow(select(dataGK[dataGK[,"TongDiemGK"] == DiemTrungBinhGK,], No, MANH, TO,TongDiemGK))
SVCoDiemTrungBinhCK <-nrow(select(dataCK[dataCK[,"TongDiemCK"] == DiemTrungBinhCK,], No, MANH, TO,TongDiemCK))
sprintf("So sinh vien co diem trung binh %s trong tap mau Giua ky la %s", DiemTrungBinhGK, SVCoDiemTrungBinhGK)
[1] "So sinh vien co diem trung binh 6.1 trong tap mau Giua ky la 0"
sprintf("So sinh vien co diem trung binh %s trong tap mau Cuoi ky la %s", DiemTrungBinhCK, SVCoDiemTrungBinhCK)
[1] "So sinh vien co diem trung binh 6.8 trong tap mau Cuoi ky la 0"
# Xac dinh do phan tan cua diem so chinh la Standard Deviation
DoPhanTanGK <- sd(DiemCuaMoiSVGK$TongDiemGK)
DoPhanTanCK <- sd(DiemCuaMoiSVCK$TongDiemCK)
# Tao dataframe de chuan bi plot bieu do
dfPhanTan <- data.frame(
KyThi = c("Giua ky", "Cuoi ky"),
DiemTrungBinh = c(DiemTrungBinhGK, DiemTrungBinhCK),
DoPhanTan = c(DoPhanTanGK, DoPhanTanCK)
)
g <- ggplot(dfPhanTan, aes(x=KyThi, y=DiemTrungBinh)) +
geom_errorbar(aes(ymin=round(DiemTrungBinh - DoPhanTan, 2), ymax=round(DiemTrungBinh + DoPhanTan, 2)), width=0.2, color="coral1") +
geom_text(aes(label = round(DiemTrungBinh - DoPhanTan, 2), y = round(DiemTrungBinh - DoPhanTan, 2)), vjust = 1.5) +
geom_text(aes(label = round(DiemTrungBinh + DoPhanTan, 2), y = round(DiemTrungBinh + DoPhanTan, 2)), vjust = -.5) +
geom_point(shape=21, color="black", fill="steelblue", size=6) +
geom_text(aes(label=round(DoPhanTan, 2)),hjust=1.5, vjust=0, color="coral1") +
labs(y="Muc do phan tan cua diem so", x="Ky thi")
# Luu hinh anh vao thu muc hinh
# ggsave("hinh/53111_mucdophantan.jpg", g)
# Cau III.12
# Tinh do meo lech cua du lieu bang ham skewness
skewnessGK <- skewness(DiemCuaMoiSVGK$TongDiemGK)
skewnessCK <- skewness(DiemCuaMoiSVCK$TongDiemCK)
sprintf("Do meo lech (skewness) cua du lieu trong mau Giua ky la %s", skewnessGK)
[1] "Do meo lech (skewness) cua du lieu trong mau Giua ky la -0.413641637265747"
sprintf("Do meo lech (skewness) cua du lieu trong mau Cuoi ky la %s", skewnessCK)
[1] "Do meo lech (skewness) cua du lieu trong mau Cuoi ky la -0.813640677743373"
# Tinh do nhon cua du lieu bang ham kurtosis
kurtosisGK <- kurtosis(DiemCuaMoiSVGK$TongDiemGK)
kurtosisCK <- kurtosis(DiemCuaMoiSVCK$TongDiemCK)
sprintf("Do nhon (kurtosis) cua du lieu trong mau Giua ky la %s", kurtosisGK)
[1] "Do nhon (kurtosis) cua du lieu trong mau Giua ky la 3.19521442229673"
sprintf("Do nhon (kurtosis) cua du lieu trong mau Cuoi ky la %s", kurtosisCK)
[1] "Do nhon (kurtosis) cua du lieu trong mau Cuoi ky la 3.17404347172822"
# Cau III.13
# Giat thich Q1 va Q3
# 0% -> 25% -> 50% -> 75% -> 100%
# min -> Q1 -> mean -> Q3 -> max
# Tinh Q1 & Q3 cho tap mau Giua ky
Q1GK = quantile(DiemCuaMoiSVGK$TongDiemGK,0.25)
Q3GK = quantile(DiemCuaMoiSVGK$TongDiemGK,0.75)
sprintf("Tu phan vi (quartile) thu nhat (Q1) va thu ba (Q3) cua tap mau Giua ky lan luot la %s va %s", Q1GK, Q3GK)
[1] "Tu phan vi (quartile) thu nhat (Q1) va thu ba (Q3) cua tap mau Giua ky lan luot la 5.2 va 6.8"
# Tinh Q1 & Q3 cho tap mau Cuoi ky
Q1CK = quantile(DiemCuaMoiSVCK$TongDiemCK,0.25)
Q3CK = quantile(DiemCuaMoiSVCK$TongDiemCK,0.75)
sprintf("Tu phan vi (quartile) thu nhat (Q1) va thu ba (Q3) cua tap mau Cuoi ky lan luot la %s va %s", Q1CK, Q3CK)
[1] "Tu phan vi (quartile) thu nhat (Q1) va thu ba (Q3) cua tap mau Cuoi ky lan luot la 5.9 va 7.9"
# Cau III.14
# Tao ham tinh ra table chua ca sinh vien co muc diem Giua ky cao thu K
GKK <- function(k){
temp<-table(round(TongSoCauDungCuaSVGK$SoCauDung/25*10,1))
options(digits = 2)
muc <- as.double(names(temp[length(temp)- k + 1]))
DS <- dataGK[dataGK[,"TongDiemGK"] == muc,]
return(DS)
}
# Tao ham tinh ra table chua ca sinh vien co muc diem Cuoi ky cao thu K
CKK <- function(k){
temp<-table(round(TongSoCauDungCuaSVCK$SoCauDung/29*10,1))
options(digits = 2)
muc <- as.double(names(temp[length(temp)- k + 1]))
DS <- dataCK[dataCK[,"TongDiemCK"] == muc,]
return(DS)
}
# Tao table voi tat ca column va lay nhung row co TongDiemGK o muc diem cao nhat trong tap mau Giua ky va Cuoi ky
DSSVQ3GK <- rbind(GKK(1), GKK(2))
DSSVQ3CK <- rbind(CKK(1), CKK(2))
# So luong sinh vien chinh la so dong (row) cua table moi tao
SoSVQ3GK = nrow(DSSVQ3GK)
SoSVQ3CK = nrow(DSSVQ3CK)
sprintf("So sinh vien co diem so nam trong 2 muc diem cao nhat trong tap Giua ky la %s", SoSVQ3GK)
[1] "So sinh vien co diem so nam trong 2 muc diem cao nhat trong tap Giua ky la 14"
sprintf("So sinh vien co diem so nam trong 2 muc diem cao nhat trong tap Cuoi ky la %s", SoSVQ3CK)
[1] "So sinh vien co diem so nam trong 2 muc diem cao nhat trong tap Cuoi ky la 24"
# Cau III.15
# Plot diem Giua ky
# Tao 1 table moi dua tren col TongDiemGK de dem so occurrence cua moi diem lon hon Q3 cua tap mau Giua ky
dfDemDiemQ3GK <- data.frame(table(DSSVQ3GK$TongDiemGK))
colnames(dfDemDiemQ3GK) <- c("DiemGK", "SoSV")
plotDiemQ3GK <- ggplot(dfDemDiemQ3GK, aes(x=DiemGK, y=SoSV)) +
geom_line(color="grey", aes(group=1)) +
geom_point(shape=21, color="black", fill="steelblue", size=6) + theme_ipsum() +
xlab("Diem") + ylab("So Sinh vien") +
theme(panel.background=element_rect(fill="cornsilk", colour=NA)) +
geom_text(aes(label=SoSV, hjust=-1.5, vjust=0))
# Plot diem cuoi ky
# Tao 1 table moi dua tren col TongDiemCK de dem so occurrence cua moi diem lon hon Q3 cua tap mau Cuoi ky
dfDemDiemQ3CK <- data.frame(table(DSSVQ3CK$TongDiemCK))
colnames(dfDemDiemQ3CK) <- c("DiemCK", "SoSV")
plotDiemQ3CK <- ggplot(dfDemDiemQ3CK, aes(x=DiemCK, y=SoSV)) +
geom_line(color="grey", aes(group=1)) +
geom_point(shape=21, color="black", fill="coral1", size=6) + theme_ipsum() +
xlab("Diem") + ylab("So Sinh vien") +
theme(panel.background=element_rect(fill="cornsilk", colour=NA)) +
geom_text(aes(label=SoSV, hjust=-1.5, vjust=0))
# Hien thi 2 bieu do
g <- grid.arrange(
arrangeGrob(plotDiemQ3GK, bottom = "Diem Giua ky"),
arrangeGrob(plotDiemQ3CK, bottom = "Diem Cuoi ky"),
nrow = 2, ncol = 1
)

g
TableGrob (2 x 1) "arrange": 2 grobs
# Luu hinh anh vao thu muc hinh
ggsave("hinh/53151_plotphodiemsinhvienQ3.jpg", g)
Saving 10 x 10 in image
# Cau III.16
# Tan dung lai 2 ham GKK & CKK de tinh so sinh vien co muc diem cao thu K
# Dat k = 5
k = 5
# Tao table voi tat ca column va lay nhung row co TongDiemGK o muc diem cao thu k trong tap mau Giua ky va Cuoi ky
DSSV_K_GK <- GKK(k)
DSSV_K_CK <- CKK(k)
# So luong sinh vien chinh la so dong (row) cua table moi tao
SoSV_K_GK = nrow(DSSV_K_GK)
SoSV_K_CK = nrow(DSSV_K_CK)
sprintf("So sinh vien co diem so voi muc diem cao thu %s trong tap Giua ky la %s", k, SoSV_K_GK)
[1] "So sinh vien co diem so voi muc diem cao thu 5 trong tap Giua ky la 37"
sprintf("So sinh vien co diem so voi muc diem cao thu %s trong tap Cuoi ky la %s", k, SoSVQ3CK)
[1] "So sinh vien co diem so voi muc diem cao thu 5 trong tap Cuoi ky la 24"
# Cau III.17
# Plot diem Giua ky
# Tao 1 table moi dua tren col TongDiemGK de dem so occurrence cua moi diem lon hon Q3 cua tap mau Giua ky
plotDemDiemK <- function(kythi, dssv) {
if (kythi == "GK") {
dfDemDiemK <- data.frame(table(dssv$TongDiemGK))
colnames(dfDemDiemK) <- c("DiemGK", "SoSV")
return(
ggplot(dfDemDiemK, aes(x=DiemGK, y=SoSV)) +
geom_line(color="grey", aes(group=1)) +
geom_point(shape=21, color="black", fill="steelblue", size=6) + theme_ipsum() +
xlab("Diem") + ylab("So Sinh vien") +
theme(panel.background=element_rect(fill="cornsilk", colour=NA)) +
geom_text(aes(label=SoSV, hjust=-1.5, vjust=0))
)
} else if (kythi == "CK") {
dfDemDiemK <- data.frame(table(dssv$TongDiemCK))
colnames(dfDemDiemK) <- c("DiemCK", "SoSV")
return(
ggplot(dfDemDiemK, aes(x=DiemCK, y=SoSV)) +
geom_line(color="grey", aes(group=1)) +
geom_point(shape=21, color="black", fill="coral1", size=6) + theme_ipsum() +
xlab("Diem") + ylab("So Sinh vien") +
theme(panel.background=element_rect(fill="cornsilk", colour=NA)) +
geom_text(aes(label=SoSV, hjust=-1.5, vjust=0))
)
}
}
# Chon 3 K lan luoi bang 5, 3, 9 cho ca 2 tap mau Giua ky va Cuoi ky
dssv_k5_GK <- GKK(5)
dssv_k3_GK <- GKK(3)
dssv_k9_GK <- GKK(9)
dssv_GK <- rbind(dssv_k3_GK, dssv_k5_GK, dssv_k9_GK)
plotDiem_K_GK <- plotDemDiemK("GK", dssv_GK)
dssv_k5_CK <- CKK(5)
dssv_k3_CK <- CKK(3)
dssv_k9_CK <- CKK(9)
dssv_CK <- rbind(dssv_k3_CK, dssv_k5_CK, dssv_k9_CK)
plotDiem_K_CK <- plotDemDiemK("CK", dssv_CK)
# Ve table chua K
# Theme cho table
thm <- ttheme_minimal(
core=list(bg_params = list(fill = blues9[1:4], col=NA),
fg_params=list(fontface=3)),
colhead=list(fg_params=list(col="navyblue", fontface=4L)),
rowhead=list(fg_params=list(col="orange", fontface=3L)))
dfTableK <- data.frame(
k = c("3", "5", "9"),
DiemGK = c(dssv_k3_GK$TongDiemGK[[1]], dssv_k5_GK$TongDiemGK[[1]], dssv_k9_GK$TongDiemGK[[1]]),
DiemCK = c(dssv_k3_CK$TongDiemCK[[1]], dssv_k5_CK$TongDiemCK[[1]], dssv_k9_CK$TongDiemCK[[1]])
)
# Dan 2 table diem Giua ky va Cuoi ky
g <- grid.arrange(
tableGrob(dfTableK, theme = thm),
ncol=1
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/53171_thongtink.jpg", g)
# Hien thi 2 bieu do
grid.newpage()

g <- grid.arrange(
arrangeGrob(plotDiem_K_GK, bottom = "Diem Giua ky"),
arrangeGrob(plotDiem_K_CK, bottom = "Diem Cuoi ky"),
nrow = 2, ncol = 1
)

# Luu hinh anh vao thu muc hinh
# ggsave("hinh/53172_plotphodiemsinhvienK.jpg", g)
Phan IV
# Import du lieu thi Giua ky
DFGK <- read.xlsx2("192_CO1007.xlsx", sheetIndex = 3, startRow = 1, endRow = 16)
# Import du lieu thi Cuoi ky
DFCK <- read.xlsx2("192_CO1007.xlsx", sheetIndex = 5, startRow = 1, endRow = 16)
# Xac dinh cac chuan dau ra xuat hien trong tap mau Giua ky
GKCDR <- DFGK[7:10, 1:26]
# Tao ra 1 matrix co chieu dai 1 x n (voi n la column tu X1 - X25)
GKCDR.1921 <- GKCDR %>% filter(GKCDR[1] == "1921") %>% select(X1:X25) %>% apply(2,as.numeric)
GKCDR.1922 <- GKCDR %>% filter(GKCDR[1] == "1922") %>% select(X1:X25) %>% apply(2,as.numeric)
GKCDR.1923 <- GKCDR %>% filter(GKCDR[1] == "1923") %>% select(X1:X25) %>% apply(2,as.numeric)
GKCDR.1924 <- GKCDR %>% filter(GKCDR[1] == "1924") %>% select(X1:X25) %>% apply(2,as.numeric)
# Xac dinh cac chuan dau ra xuat hien trong tap mau Cuoi ky
CKCDR <- DFCK[7:10, 1:30]
# Tao ra 1 matrix co chieu dai 1 x n (voi n la column tu X1 - X29)
CKCDR.1921 <- CKCDR %>% filter(CKCDR[1] == "1921") %>% select(X1:X29) %>% apply(2,as.numeric)
CKCDR.1922 <- CKCDR %>% filter(CKCDR[1] == "1922") %>% select(X1:X29) %>% apply(2,as.numeric)
CKCDR.1923 <- CKCDR %>% filter(CKCDR[1] == "1923") %>% select(X1:X29) %>% apply(2,as.numeric)
CKCDR.1924 <- CKCDR %>% filter(CKCDR[1] == "1924") %>% select(X1:X29) %>% apply(2,as.numeric)
# Cau IV.1
# table(GKCDR.1921) se group cac chuan dau ra lai cung voi count cua tung chuan dau ra.
# So luong chuan dau ra lien quan den cac cau hoi xuat hien trong tap mau Giua ky
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1921 trong tap mau Giua ky la %s", length(names(table(GKCDR.1921))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1921 trong tap mau Giua ky la 5"
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1922 trong tap mau Giua ky la %s", length(names(table(GKCDR.1922))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1922 trong tap mau Giua ky la 6"
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1923 trong tap mau Giua ky la %s", length(names(table(GKCDR.1923))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1923 trong tap mau Giua ky la 5"
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1924 trong tap mau Giua ky la %s", length(names(table(GKCDR.1924))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1924 trong tap mau Giua ky la 5"
# So luong chuan dau ra lien quan den cac cau hoi xuat hien trong tap mau Cuoi ky
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1921 trong tap mau Cuoi ky la %s", length(names(table(CKCDR.1921))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1921 trong tap mau Cuoi ky la 4"
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1922 trong tap mau Cuoi ky la %s", length(names(table(CKCDR.1922))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1922 trong tap mau Cuoi ky la 4"
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1923 trong tap mau Cuoi ky la %s", length(names(table(CKCDR.1923))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1923 trong tap mau Cuoi ky la 4"
sprintf("So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1924 trong tap mau Cuoi ky la %s", length(names(table(CKCDR.1924))))
[1] "So luong chuan dau ra lien quan den cac cau hoi xuat hien trong de 1924 trong tap mau Cuoi ky la 4"
# Cau IV.2
# Danh sach cac chuan dau ra chi tiet lien quan den cac cau hoi xuat hien trong tap mau Giua ky
# NOTE: names([table-object]) -> lay tat ca
# NOTE: paste([list-object], collapse = ", ") => chuyen list thanh string cach nhau bang dau ", "
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1921 trong tap mau Giua ky lan luot la %s", paste(names(table(GKCDR.1921)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1921 trong tap mau Giua ky lan luot la 11, 12, 21, 22, 31"
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1922 trong tap mau Giua ky lan luot la %s", paste(names(table(GKCDR.1922)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1922 trong tap mau Giua ky lan luot la 11, 12, 21, 22, 23, 31"
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1923 trong tap mau Giua ky lan luot la %s", paste(names(table(GKCDR.1923)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1923 trong tap mau Giua ky lan luot la 11, 12, 21, 22, 31"
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1924 trong tap mau Giua ky lan luot la %s", paste(names(table(GKCDR.1924)), collapse = ','))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1924 trong tap mau Giua ky lan luot la 11,12,21,22,31"
# Danh sach cac chuan dau ra chi tiet lien quan den cac cau hoi xuat hien trong tap mau Cuoi ky
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1921 trong tap mau Cuoi ky lan luot la %s", paste(names(table(CKCDR.1921)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1921 trong tap mau Cuoi ky lan luot la 12, 23, 31, 32"
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1922 trong tap mau Cuoi ky lan luot la %s", paste(names(table(CKCDR.1922)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1922 trong tap mau Cuoi ky lan luot la 12, 23, 31, 32"
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1923 trong tap mau Cuoi ky lan luot la %s", paste(names(table(CKCDR.1923)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1923 trong tap mau Cuoi ky lan luot la 12, 23, 31, 32"
sprintf("Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1924 trong tap mau Cuoi ky lan luot la %s", paste(names(table(CKCDR.1924)), collapse = ', '))
[1] "Danh sach cac chuan dau ra lien quan den cac cau hoi xuat hien trong ma de 1924 trong tap mau Cuoi ky lan luot la 12, 23, 31, 32"
# Cau IV.3
#Graph Tan suat cua Chuan dau ra o tap mau Giua ky
G3GK.data1921 <- as.data.frame(table(GKCDR.1921))
G3GK.data1922 <- as.data.frame(table(GKCDR.1922))
G3GK.data1923 <- as.data.frame(table(GKCDR.1923))
G3GK.data1924 <- as.data.frame(table(GKCDR.1924))
#MD 1921, 1923, 1924 share mutual frequency
G3GK1921 <- ggplot(G3GK.data1921, aes(x = GKCDR.1921,y =G3GK.data1921[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3GK.data1921[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1921 ", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "#ffaa80"))
G3GK1922 <- ggplot(G3GK.data1922, aes(x = GKCDR.1922,y =G3GK.data1922[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3GK.data1922[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1922", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "#ffaa80"))
G3GK1923 <- ggplot(G3GK.data1923, aes(x = GKCDR.1923,y =G3GK.data1923[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3GK.data1923[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1922", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "#ffaa80"))
G3GK1924 <- ggplot(G3GK.data1924, aes(x = GKCDR.1924,y =G3GK.data1924[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3GK.data1924[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1922", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "#ffaa80"))
G3GK <- ggarrange(G3GK1921, G3GK1922, G3GK1923, G3GK1924, ncol = 2, nrow = 2)
G3GK

# ggsave("hinh/5431_plotchuandauragk.jpg", G3GK)
#Graph Tan suat cua Chuan dau ra o tap mau Cuoi ky
G3CK.data1921 <- as.data.frame(table(CKCDR.1921))
G3CK.data1922 <- as.data.frame(table(CKCDR.1922))
G3CK.data1923 <- as.data.frame(table(CKCDR.1923))
G3CK.data1924 <- as.data.frame(table(CKCDR.1924))
#MD 1921, 1923, 1924 share mutual frequency
G3CK1921 <- ggplot(G3CK.data1921, aes(x = CKCDR.1921,y =G3CK.data1921[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3CK.data1921[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1921 ", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "cornsilk"))
G3CK1922 <- ggplot(G3CK.data1922, aes(x = CKCDR.1922,y =G3CK.data1922[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3CK.data1922[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1922", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "cornsilk"))
G3CK1923 <- ggplot(G3CK.data1923, aes(x = CKCDR.1923,y =G3CK.data1923[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3CK.data1923[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1922", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "cornsilk"))
G3CK1924 <- ggplot(G3CK.data1924, aes(x = CKCDR.1924,y =G3CK.data1924[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=G3CK.data1924[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Bieu do tan suat Learning outcome GK-1922", x = "Learning outcome", y = "Frequency") +
theme(panel.background = element_rect(fill = "cornsilk"))
G3CK <- ggarrange(G3CK1921, G3CK1922, G3CK1923, G3CK1924, ncol = 2, nrow = 2)
G3CK

# ggsave("hinh/5432_plotchuandaurack.jpg", G3GK)
# Tao dataframe tu file Excel
DiemGK <- read.xlsx2("192_CO1007.xlsx", sheetIndex = 2, startRow = 5)
# Don cac truong co ky tu rong
DiemGK <- DiemGK %>% filter(No != "")
# Tao matrix moi
DiemGK <- subset(DiemGK, select = No:MADE)
DiemGK.1921 <- DiemGK %>% filter(MADE == 1921) %>% select(X1:X25) %>% apply(2,as.numeric)
DiemGK.1922 <- DiemGK %>% filter(MADE == 1922) %>% select(X1:X25) %>% apply(2,as.numeric)
DiemGK.1923 <- DiemGK %>% filter(MADE == 1923) %>% select(X1:X25) %>% apply(2,as.numeric)
DiemGK.1924 <- DiemGK %>% filter(MADE == 1924) %>% select(X1:X25) %>% apply(2,as.numeric)
#Add Learning outcome at top of data frame
DiemGK.1921.LO <- as.data.frame(rbind(GKCDR.1921,DiemGK.1921))
DiemGK.1922.LO <- as.data.frame(rbind(GKCDR.1922,DiemGK.1922))
DiemGK.1923.LO <- as.data.frame(rbind(GKCDR.1923,DiemGK.1923))
DiemGK.1924.LO <- as.data.frame(rbind(GKCDR.1924,DiemGK.1924))
#Learning outcome name in midterm
names(table(GKCDR.1921))
[1] "11" "12" "21" "22" "31"
#1921
# Phan loai theo cac chuan dau ra
DiemGK.1921.LO11 <- DiemGK.1921.LO[-1,DiemGK.1921.LO[1,] == 11]
DiemGK.1921.LO12 <- DiemGK.1921.LO[-1,DiemGK.1921.LO[1,] == 12]
DiemGK.1921.LO21 <- DiemGK.1921.LO[-1,DiemGK.1921.LO[1,] == 21]
DiemGK.1921.LO22 <- DiemGK.1921.LO[-1,DiemGK.1921.LO[1,] == 22]
DiemGK.1921.LO31 <- DiemGK.1921.LO[-1,DiemGK.1921.LO[1,] == 31]
# Cong tong theo dong cua dataframe va them Tong moi vao trong data
DiemGK.1921.LO11 <-table(apply(DiemGK.1921.LO11, 1, sum))
DiemGK.1921.LO12 <-table(apply(DiemGK.1921.LO12, 1, sum))
DiemGK.1921.LO21 <-table(apply(DiemGK.1921.LO21, 1, sum))
DiemGK.1921.LO22 <-table(apply(DiemGK.1921.LO22, 1, sum))
DiemGK.1921.LO31 <-table(apply(DiemGK.1921.LO31, 1, sum))
#1922
#Sorting answer into learning outcome group
DiemGK.1922.LO11 <- DiemGK.1922.LO[-1,DiemGK.1922.LO[1,] == 11]
DiemGK.1922.LO12 <- DiemGK.1922.LO[-1,DiemGK.1922.LO[1,] == 12]
DiemGK.1922.LO21 <- DiemGK.1922.LO[-1,DiemGK.1922.LO[1,] == 21]
DiemGK.1922.LO22 <- DiemGK.1922.LO[-1,DiemGK.1922.LO[1,] == 22]
DiemGK.1922.LO31 <- DiemGK.1922.LO[-1,DiemGK.1922.LO[1,] == 31]
DiemGK.1922.LO23 <- DiemGK.1922.LO[-1,DiemGK.1922.LO[1,] == 23]
#Sum row data frame and map sum result into instance group
DiemGK.1922.LO11 <-table(apply(DiemGK.1922.LO11, 1, sum))
DiemGK.1922.LO12 <-table(apply(DiemGK.1922.LO12, 1, sum))
DiemGK.1922.LO21 <-table(apply(DiemGK.1922.LO21, 1, sum))
DiemGK.1922.LO22 <-table(apply(DiemGK.1922.LO22, 1, sum))
DiemGK.1922.LO31 <-table(apply(DiemGK.1922.LO31, 1, sum))
DiemGK.1922.LO23 <-table(DiemGK.1922.LO23)
#1923
#Sorting answer into learning outcome group
DiemGK.1923.LO11 <- DiemGK.1923.LO[-1,DiemGK.1923.LO[1,] == 11]
DiemGK.1923.LO12 <- DiemGK.1923.LO[-1,DiemGK.1923.LO[1,] == 12]
DiemGK.1923.LO21 <- DiemGK.1923.LO[-1,DiemGK.1923.LO[1,] == 21]
DiemGK.1923.LO22 <- DiemGK.1923.LO[-1,DiemGK.1923.LO[1,] == 22]
DiemGK.1923.LO31 <- DiemGK.1923.LO[-1,DiemGK.1923.LO[1,] == 31]
DiemGK.1923.LO31 <- DiemGK.1923.LO[-1,DiemGK.1923.LO[1,] == 31]
#Sum row data frame and map sum result into instance group
DiemGK.1923.LO11 <-table(apply(DiemGK.1923.LO11, 1, sum))
DiemGK.1923.LO12 <-table(apply(DiemGK.1923.LO12, 1, sum))
DiemGK.1923.LO21 <-table(apply(DiemGK.1923.LO21, 1, sum))
DiemGK.1923.LO22 <-table(apply(DiemGK.1923.LO22, 1, sum))
DiemGK.1923.LO31 <-table(apply(DiemGK.1923.LO31, 1, sum))
#1924
# Phan loai theo cac chuan dau ra
DiemGK.1924.LO11 <- DiemGK.1924.LO[-1,DiemGK.1924.LO[1,] == 11]
DiemGK.1924.LO12 <- DiemGK.1924.LO[-1,DiemGK.1924.LO[1,] == 12]
DiemGK.1924.LO21 <- DiemGK.1924.LO[-1,DiemGK.1924.LO[1,] == 21]
DiemGK.1924.LO22 <- DiemGK.1924.LO[-1,DiemGK.1924.LO[1,] == 22]
DiemGK.1924.LO31 <- DiemGK.1924.LO[-1,DiemGK.1924.LO[1,] == 31]
# Cong tong theo dong cua dataframe va them Tong moi vao trong data
DiemGK.1924.LO11 <-table(apply(DiemGK.1924.LO11, 1, sum))
DiemGK.1924.LO12 <-table(apply(DiemGK.1924.LO12, 1, sum))
DiemGK.1924.LO21 <-table(apply(DiemGK.1924.LO21, 1, sum))
DiemGK.1924.LO22 <-table(apply(DiemGK.1924.LO22, 1, sum))
DiemGK.1924.LO31 <-table(apply(DiemGK.1924.LO31, 1, sum))
# Learning outcome 11
LOR.GK11 <- as.data.frame(bind_rows(DiemGK.1921.LO11,DiemGK.1922.LO11,DiemGK.1923.LO11,DiemGK.1924.LO11))
# Thay cac gia tri N/A thanh 0
LOR.GK11[is.na(LOR.GK11)] <- 0
# Cong theo dong
LOR.GK11 <- as.data.frame(apply(LOR.GK11,2,sum))
LOR.GK11$SoCauTLDung <- row.names(LOR.GK11)
# xap sep lai data
LOR.GK11<- transform(LOR.GK11, SoCauTLDung = as.numeric(SoCauTLDung))
LOR.GK11<- arrange(LOR.GK11,SoCauTLDung)
#Learning outcome 12 (merge into usable data frame)
LOR.GK12 <- as.data.frame(bind_rows(DiemGK.1921.LO12,DiemGK.1922.LO12,DiemGK.1923.LO12,DiemGK.1924.LO12))
#Fill N/A cell with 0
LOR.GK12[is.na(LOR.GK12)] <- 0
#Sum column
LOR.GK12 <- as.data.frame(apply(LOR.GK12,2,sum))
LOR.GK12$SoCauTLDung <- row.names(LOR.GK12)
#Learning outcome 21 (merge into usable data frame)
LOR.GK21 <- as.data.frame(bind_rows(DiemGK.1921.LO21,DiemGK.1922.LO21,DiemGK.1923.LO21,DiemGK.1924.LO21))
#Fill N/A cell with 0
LOR.GK21[is.na(LOR.GK21)] <- 0
#Sum column
LOR.GK21 <- as.data.frame(apply(LOR.GK21,2,sum))
LOR.GK21$SoCauTLDung <- row.names(LOR.GK21)
#Learning outcome 22 (merge into usable data frame)
LOR.GK22 <- as.data.frame(bind_rows(DiemGK.1921.LO22,DiemGK.1922.LO22,DiemGK.1923.LO22,DiemGK.1924.LO22))
#Fill N/A cell with 0
LOR.GK22[is.na(LOR.GK22)] <- 0
#Sum column
LOR.GK22 <- as.data.frame(apply(LOR.GK22,2,sum))
LOR.GK22$SoCauTLDung <- row.names(LOR.GK22)
#Learning outcome 31 (merge into usable data frame)
LOR.GK31 <- as.data.frame(bind_rows(DiemGK.1921.LO31,DiemGK.1922.LO31,DiemGK.1923.LO31,DiemGK.1924.LO31))
#Fill N/A cell with 0
LOR.GK31[is.na(LOR.GK31)] <- 0
#Sum column
LOR.GK31 <- as.data.frame(apply(LOR.GK31,2,sum))
LOR.GK31$SoCauTLDung <- row.names(LOR.GK31)
#Learning outcome 23
LOR.GK23 <-as.data.frame(DiemGK.1922.LO23)
LOR.GK23$SoCauTraLoiDung <- LOR.GK23[,1]
GLOR.GK11 <- ggplot(LOR.GK11, aes(x = as.character(LOR.GK11[,2]), y = LOR.GK11[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.GK11[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 11", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOR.GK12 <- ggplot(LOR.GK12, aes(x = as.character(LOR.GK12[,2]), y = LOR.GK12[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.GK12[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOR.GK21 <- ggplot(LOR.GK21, aes(x = as.character(LOR.GK21[,2]), y = LOR.GK21[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.GK21[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 21", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOR.GK22 <- ggplot(LOR.GK22, aes(x = as.character(LOR.GK22[,2]), y = LOR.GK22[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.GK22[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 22", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOR.GK31 <- ggplot(LOR.GK31, aes(x = as.character(LOR.GK31[,2]), y = LOR.GK31[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.GK31[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 31", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOR.GK23 <- ggplot(LOR.GK23, aes(x = as.character(LOR.GK23[,3]), y = LOR.GK23[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.GK23[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 23", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOR.GK <-ggarrange(GLOR.GK11,GLOR.GK12,GLOR.GK21,GLOR.GK22,GLOR.GK23,GLOR.GK31, ncol = 3, nrow = 2)
GLOR.GK

# ggsave("hinh/5451_bieudooutcome_gk.jpg", GLOR.GK)
# Tao dataframe tu file excel cho tap mau Cuoi ky
DiemCK <- read.xlsx2("192_CO1007.xlsx", sheetIndex = 4, startRow = 5)
# Loc No rong
DiemCK <- DiemCK %>% filter(No != "")
# Tao matrix
DiemCK <- subset(DiemCK, select = No:MADE)
DiemCK.1921 <- DiemCK %>% filter(MADE == 1921) %>% select(X1:X29) %>% apply(2,as.numeric)
DiemCK.1922 <- DiemCK %>% filter(MADE == 1922) %>% select(X1:X29) %>% apply(2,as.numeric)
DiemCK.1923 <- DiemCK %>% filter(MADE == 1923) %>% select(X1:X29) %>% apply(2,as.numeric)
DiemCK.1924 <- DiemCK %>% filter(MADE == 1924) %>% select(X1:X29) %>% apply(2,as.numeric)
#Add Learning outcome at top of data frame
DiemCK.1921.LO <- as.data.frame(rbind(CKCDR.1921,DiemCK.1921))
DiemCK.1922.LO <- as.data.frame(rbind(CKCDR.1922,DiemCK.1922))
DiemCK.1923.LO <- as.data.frame(rbind(CKCDR.1923,DiemCK.1923))
DiemCK.1924.LO <- as.data.frame(rbind(CKCDR.1924,DiemCK.1924))
#Learning outcome name in final exam
names(table(CKCDR.1921))
[1] "12" "23" "31" "32"
#1921
#S Phan loai theo cac chuan dau ra
DiemCK.1921.LO12 <- DiemCK.1921.LO[-1,DiemCK.1921.LO[1,] == 12]
DiemCK.1921.LO23 <- DiemCK.1921.LO[-1,DiemCK.1921.LO[1,] == 23]
DiemCK.1921.LO31 <- DiemCK.1921.LO[-1,DiemCK.1921.LO[1,] == 31]
DiemCK.1921.LO32 <- DiemCK.1921.LO[-1,DiemCK.1921.LO[1,] == 32]
# Cong tong theo dong cua dataframe va them Tong moi vao trong data
DiemCK.1921.LO12 <-table(apply(DiemCK.1921.LO12, 1, sum))
DiemCK.1921.LO23 <-table(apply(DiemCK.1921.LO23, 1, sum))
DiemCK.1921.LO31 <-table(apply(DiemCK.1921.LO31, 1, sum))
DiemCK.1921.LO32 <-table(apply(DiemCK.1921.LO32, 1, sum))
#1922
#Sorting answer into learning outcome group
DiemCK.1922.LO12 <- DiemCK.1922.LO[-1,DiemCK.1922.LO[1,] == 12]
DiemCK.1922.LO23 <- DiemCK.1922.LO[-1,DiemCK.1922.LO[1,] == 23]
DiemCK.1922.LO31 <- DiemCK.1922.LO[-1,DiemCK.1922.LO[1,] == 31]
DiemCK.1922.LO32 <- DiemCK.1922.LO[-1,DiemCK.1922.LO[1,] == 32]
#Sum row data frame and map sum result into instance group
DiemCK.1922.LO12 <-table(apply(DiemCK.1922.LO12, 1, sum))
DiemCK.1922.LO23 <-table(apply(DiemCK.1922.LO23, 1, sum))
DiemCK.1922.LO31 <-table(apply(DiemCK.1922.LO31, 1, sum))
DiemCK.1922.LO32 <-table(apply(DiemCK.1922.LO32, 1, sum))
#1923
#Sorting answer into learning outcome group
DiemCK.1923.LO12 <- DiemCK.1923.LO[-1,DiemCK.1923.LO[1,] == 12]
DiemCK.1923.LO23 <- DiemCK.1923.LO[-1,DiemCK.1923.LO[1,] == 23]
DiemCK.1923.LO31 <- DiemCK.1923.LO[-1,DiemCK.1923.LO[1,] == 31]
DiemCK.1923.LO32 <- DiemCK.1923.LO[-1,DiemCK.1923.LO[1,] == 32]
#Sum row data frame and map sum result into instance group
DiemCK.1923.LO12 <-table(apply(DiemCK.1923.LO12, 1, sum))
DiemCK.1923.LO23 <-table(apply(DiemCK.1923.LO23, 1, sum))
DiemCK.1923.LO31 <-table(apply(DiemCK.1923.LO31, 1, sum))
DiemCK.1923.LO32 <-table(apply(DiemCK.1923.LO32, 1, sum))
#1924
#Sorting answer into learning outcome group
DiemCK.1924.LO12 <- DiemCK.1924.LO[-1,DiemCK.1924.LO[1,] == 12]
DiemCK.1924.LO23 <- DiemCK.1924.LO[-1,DiemCK.1924.LO[1,] == 23]
DiemCK.1924.LO31 <- DiemCK.1924.LO[-1,DiemCK.1924.LO[1,] == 31]
DiemCK.1924.LO32 <- DiemCK.1924.LO[-1,DiemCK.1924.LO[1,] == 32]
#Sum row data frame and map sum result into instance group
DiemCK.1924.LO12 <-table(apply(DiemCK.1924.LO12, 1, sum))
DiemCK.1924.LO23 <-table(apply(DiemCK.1924.LO23, 1, sum))
DiemCK.1924.LO31 <-table(apply(DiemCK.1924.LO31, 1, sum))
DiemCK.1924.LO32 <-table(apply(DiemCK.1924.LO32, 1, sum))
#Learning outcome 12
LOR.CK12 <- as.data.frame(bind_rows(DiemCK.1921.LO12,DiemCK.1922.LO12,DiemCK.1923.LO12,DiemCK.1924.LO12))
# Thay cac gia tri N/A thanh 0
LOR.CK12[is.na(LOR.CK12)] <- 0
# Cong cot
LOR.CK12 <- as.data.frame(apply(LOR.CK12,2,sum))
# Sap xep lai data
LOR.CK12$SoCauTLDung <- row.names(LOR.CK12)
#Learning outcome 23 (merge into usable data frame)
LOR.CK23 <- as.data.frame(bind_rows(DiemCK.1921.LO23,DiemCK.1922.LO23,DiemCK.1923.LO23,DiemCK.1924.LO23))
#Fill N/A cell with 0
LOR.CK23[is.na(LOR.CK23)] <- 0
#Sum column
LOR.CK23 <- as.data.frame(apply(LOR.CK23,2,sum))
LOR.CK23$SoCauTLDung <- row.names(LOR.CK23)
#Learning outcome 31 (merge into usable data frame)
LOR.CK31 <- as.data.frame(bind_rows(DiemCK.1921.LO31,DiemCK.1922.LO31,DiemCK.1923.LO31,DiemCK.1924.LO31))
#Fill N/A cell with 0
LOR.CK31[is.na(LOR.CK31)] <- 0
#Sum column
LOR.CK31 <- as.data.frame(apply(LOR.CK31,2,sum))
LOR.CK31$SoCauTLDung <- row.names(LOR.CK31)
LOR.CK31
#Learning outcome 32 (merge into usable data frame)
LOR.CK32 <- as.data.frame(bind_rows(DiemCK.1921.LO32,DiemCK.1922.LO32,DiemCK.1923.LO32,DiemCK.1924.LO32))
#Fill N/A cell with 0
LOR.CK32[is.na(LOR.CK32)] <- 0
#Sum column
LOR.CK32 <- as.data.frame(apply(LOR.CK32,2,sum))
LOR.CK32$SoCauTLDung <- row.names(LOR.CK32)
#Graph ----
GLOR.CK12 <-ggplot(LOR.CK12, aes(x = as.character(LOR.CK12[,2]), y = LOR.CK12[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.CK12[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#57d5c5"))
GLOR.CK23 <- ggplot(LOR.CK23, aes(x = as.character(LOR.CK23[,2]), y = LOR.CK23[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.CK23[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 23", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#57d5c5"))
GLOR.CK31 <-ggplot(LOR.CK31, aes(x = as.character(LOR.CK31[,2]), y = LOR.CK31[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.CK31[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 31", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#57d5c5"))
GLOR.CK32 <- ggplot(LOR.CK32, aes(x = as.character(LOR.CK32[,2]), y = LOR.CK32[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LOR.CK32[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 32", x = "So cau tra loi dung", y = "So sinh vien") + theme(panel.background = element_rect(fill = "#57d5c5"))
GLOR.CK <-ggarrange(GLOR.CK12,GLOR.CK23,GLOR.CK31,GLOR.CK32, ncol = 2, nrow = 2)
GLOR.CK

ggsave("hinh/5452_bieudooutcome_ck.jpg", GLOR.CK)
Saving 15 x 15 in image
# Cau IV.7
# Data cho Chuan dau ra Giua ky va Cuoi ky
LO.data<- as.data.frame(bind_rows(table(GKCDR.1921),table(CKCDR.1921)))
# Chuuyen doi thanh data dung de ve bieu do
LO.data[is.na(LO.data)] <- 0
LO.data<- as.data.frame(apply(LO.data,2,sum))
LO.data$LO <- row.names(LO.data)
LO.data
# Do thi
GLO.data <- ggplot(LO.data, aes(x = as.character(LO.data[,2]), y = LO.data[,1])) + geom_bar(stat = "identity") + geom_text(aes(label=LO.data[,1]), vjust=-0.3, size=3.5, )+
labs(title = "Question per learning outcome", x = "Learning outcome", y = "Questions quantity") + theme(panel.background = element_rect(fill = "#57d5c5"))
GLO.data
ggsave("hinh/5471_bieudocauhoi.jpg", GLO.data)
Saving 7.05 x 4.36 in image

#
TotalQFrameCK<-as.data.frame(table(as.numeric(CKCDR[1,-1])))
TotalQFrameGK<-as.data.frame(table(as.numeric(GKCDR[1,-1])))
TotalQFrameGKEX<-as.data.frame(bind_rows(table(GKCDR.1921),
table(GKCDR.1922),
table(GKCDR.1923),
table(GKCDR.1924)))
TotalQFrameGKEX[is.na(TotalQFrameGKEX)] <- 0
#exception for 1922 LO 23 & 12
TotalQFrameGKEX
# Cau IV.8
#convert data from problem 6 for reuse
LOW.GK11 <- LOR.GK11
LOW.GK11 <- transform(LOW.GK11, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.GK11$SoCauTLSai <- abs(LOW.GK11$SoCauTLDung - as.numeric(TotalQFrameGK[1,2]))
LOW.GK11 <- LOW.GK11[,c(1,3)]
#percentaging
LOW.GK11$percent <- round(LOW.GK11[,1]/sum(LOW.GK11[,1]),3)
LOW.GK11
#exception handling for Learning outcome 12
LOW.GK12.1921.3.4<- as.data.frame(bind_rows(DiemGK.1921.LO12,
DiemGK.1923.LO12,
DiemGK.1924.LO12,
))
#fill na with 0
LOW.GK12.1921.3.4[is.na(LOW.GK12.1921.3.4)] <- 0
LOW.GK12.1921.3.4<- as.data.frame(apply(LOW.GK12.1921.3.4,2,sum))
LOW.GK12.1921.3.4$SoCauTLSai <- abs(as.numeric(row.names(LOW.GK12.1921.3.4)) - 12)
#percentaging
LOW.GK12.1921.3.4$percent <-round(LOW.GK12.1921.3.4[,1]/sum(LOW.GK12.1921.3.4[,1]),3)
LOW.GK12.1922<-t(as.data.frame(bind_rows(DiemGK.1922.LO12)))
temp1922 <- abs(as.numeric(row.names(LOW.GK12.1922)) - 11)
LOW.GK12.1922<-as.data.frame(DiemGK.1922.LO12)
LOW.GK12.1922$SoCauTLSai <- as.numeric(temp1922)
LOW.GK12.1922$percent <- round(LOW.GK12.1922[,2]/sum(LOW.GK12.1922[,2]),3)
LOW.GK12.1922<- LOW.GK12.1922[,c(3,4)]
#reserve
DiemGK.1921.LO12.mod <- DiemGK.1921.LO12
DiemGK.1922.LO12.mod <- DiemGK.1922.LO12
DiemGK.1923.LO12.mod <- DiemGK.1923.LO12
DiemGK.1924.LO12.mod <- DiemGK.1924.LO12
rownames(DiemGK.1921.LO12.mod)<- abs(as.numeric(rownames(DiemGK.1921.LO12)) -12)
rownames(DiemGK.1922.LO12.mod)<- abs(as.numeric(rownames(DiemGK.1922.LO12)) -11)
rownames(DiemGK.1923.LO12.mod)<- abs(as.numeric(rownames(DiemGK.1923.LO12)) -12)
rownames(DiemGK.1924.LO12.mod)<- abs(as.numeric(rownames(DiemGK.1924.LO12)) -12)
LOW.GK12 <- as.data.frame(bind_rows(DiemGK.1921.LO12.mod,
DiemGK.1922.LO12.mod,
DiemGK.1923.LO12.mod,
DiemGK.1924.LO12.mod,
))
LOW.GK12[is.na(LOW.GK12)] <- 0
as.numeric(row.names(DiemGK.1921.LO12)) -1
[1] 3 4 5 6 7 8 9 10 11
LOW.GK12<-as.data.frame(apply(LOW.GK12,2,sum))
LOW.GK12
LOW.GK12$SoCauTLSai <- abs(as.numeric(row.names(LOW.GK12)))
LOW.GK12$percent <- round(LOW.GK12[,1]/sum(LOW.GK12[,1]),3)
LOW.GK12
LOW.GK21 <- LOR.GK21
LOW.GK21 <- transform(LOW.GK21, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.GK21$SoCauTLSai <- abs(LOW.GK21$SoCauTLDung - as.numeric(TotalQFrameGK[3,2]))
LOW.GK21 <- LOW.GK21[,c(1,3)]
LOW.GK21
#percentaging
LOW.GK21$percent <- round(LOW.GK21[,1]/sum(LOW.GK21[,1]),3)
LOW.GK21
LOW.GK22 <- LOR.GK22
LOW.GK22 <- transform(LOW.GK22, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.GK22$SoCauTLSai <- abs(LOW.GK22$SoCauTLDung - as.numeric(TotalQFrameGK[4,2]))
LOW.GK22 <- LOW.GK22[,c(1,3)]
#percentaging
LOW.GK22$percent <- round(LOW.GK22[,1]/sum(LOW.GK22[,1]),3)
LOW.GK22
LOW.GK31 <- LOR.GK31
LOW.GK31 <- transform(LOW.GK31, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.GK31$SoCauTLSai <- abs(LOW.GK31$SoCauTLDung - as.numeric(TotalQFrameGK[5,2]))
LOW.GK31 <- LOW.GK31[,c(1,3)]
#percentaging
LOW.GK31$percent <- round(LOW.GK31[,1]/sum(LOW.GK31[,1]),3)
LOW.GK31
#exception for 1922 code
LOW.GK23 <- LOR.GK23
LOW.GK23 <- transform(LOW.GK23, SoCauTraLoiDung = as.numeric(SoCauTraLoiDung))
LOW.GK23$SoCauTLSai <- abs(as.numeric(LOW.GK23$SoCauTraLoiDung) - 2)
LOW.GK23 <- LOW.GK23[,c(2,4)]
#percentaging
LOW.GK23$percent <- round(LOW.GK23[,1]/sum(LOW.GK23[,1]),3)
LOW.GK23
#Graph ---
GLOW.GK11 <- ggplot(LOW.GK11, aes(x = as.character(LOW.GK11[,2]), y = LOW.GK11[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK11[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 11", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK12 <- ggplot(LOW.GK12, aes(x = as.character(LOW.GK12[,2]), y = LOW.GK12[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK12[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK21 <- ggplot(LOW.GK21, aes(x = as.character(LOW.GK21[,2]), y = LOW.GK21[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK21[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 21", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK22 <- ggplot(LOW.GK22, aes(x = as.character(LOW.GK22[,2]), y = LOW.GK22[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK22[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 22", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK31 <- ggplot(LOW.GK31, aes(x = as.character(LOW.GK31[,2]), y = LOW.GK31[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK31[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 31", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK23 <- ggplot(LOW.GK23, aes(x = as.character(LOW.GK23[,2]), y = LOW.GK23[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK23[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 31", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK12.1.3.4 <- ggplot(LOW.GK12.1921.3.4, aes(x = as.character(LOW.GK12.1921.3.4[,2]), y = LOW.GK12.1921.3.4[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.GK12.1921.3.4[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12-1921-3-4", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK12.2 <- ggplot(LOW.GK12.1922, aes(x = as.character(LOW.GK12.1922[,1]), y = LOW.GK12.1922[,2])) + geom_bar(stat =
"identity") + geom_text(aes(label=LOW.GK12.1922[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12-1922", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.GK <-ggarrange(GLOW.GK11,GLOW.GK12.2,GLOW.GK12.1.3.4,GLOW.GK12,GLOW.GK21,GLOW.GK22,GLOW.GK23,GLOW.GK31, ncol = 2, nrow = 4)
GLOW.GK

# ggsave("hinh/5481_bieudotansuatcausaigk.jpg", GLOW.GK)
# Cau IV.9
#convert data from problem 6 for reuse
LOW.CK12 <- LOR.CK12
LOW.CK12 <- transform(LOW.CK12, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.CK12$SoCauTLSai <- abs(LOW.CK12$SoCauTLDung - as.numeric(TotalQFrameCK[1,2]))
LOW.CK12 <- LOW.CK12[,c(1,3)]
#percentaging
LOW.CK12$percent <- round(LOW.CK12[,1]/sum(LOW.CK12[,1]),3)
LOW.CK12
LOW.CK23 <- LOR.CK23
LOW.CK23 <- transform(LOW.CK23, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.CK23$SoCauTLSai <- abs(LOW.CK23$SoCauTLDung - as.numeric(TotalQFrameCK[2,2]))
LOW.CK23 <- LOW.CK23[,c(1,3)]
#percentaging
LOW.CK23$percent <- round(LOW.CK23[,1]/sum(LOW.CK23[,1]),3)
LOW.CK23
LOW.CK31 <- LOR.CK31
LOW.CK31 <- transform(LOW.CK31, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.CK31$SoCauTLSai <- abs(LOW.CK31$SoCauTLDung - as.numeric(TotalQFrameCK[3,2]))
LOW.CK31 <- LOW.CK31[,c(1,3)]
#percentaging
LOW.CK31$percent <- round(LOW.CK31[,1]/sum(LOW.CK31[,1]),3)
LOW.CK31
LOW.CK32 <- LOR.CK32
LOW.CK32 <- transform(LOW.CK32, SoCauTLDung = as.numeric(SoCauTLDung))
LOW.CK32$SoCauTLSai <- abs(LOW.CK32$SoCauTLDung - as.numeric(TotalQFrameCK[4,2]))
LOW.CK32 <- LOW.CK32[,c(1,3)]
#percentaging
LOW.CK32$percent <- round(LOW.CK32[,1]/sum(LOW.CK32[,1]),3)
LOW.CK32
#Graph---
GLOW.CK12 <- ggplot(LOW.CK12, aes(x = as.character(LOW.CK12[,2]), y = LOW.CK12[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.CK12[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.CK23 <- ggplot(LOW.CK23, aes(x = as.character(LOW.CK23[,2]), y = LOW.CK23[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.CK23[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 23", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.CK31 <- ggplot(LOW.CK31, aes(x = as.character(LOW.CK31[,2]), y = LOW.CK31[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.CK31[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 31", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.CK32 <- ggplot(LOW.CK32, aes(x = as.character(LOW.CK32[,2]), y = LOW.CK32[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW.CK32[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 32", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
GLOW.CK <-ggarrange(GLOW.CK12,GLOW.CK23,GLOW.CK31,GLOW.CK32, ncol = 3, nrow = 2)
GLOW.CK

# Cau IV.10
LoListCK <- data.frame(LO= names(table(CKCDR.1922)))
LoListGK <- data.frame(LO= names(table(GKCDR.1922)))
LoAp<-as.data.frame(table(rbind(LoListCK,LoListGK)))
#Lo appeared in both midterm and final
LoAp[LoAp$Freq == 2,]
TotalQFrameCK[TotalQFrameCK$Var1 == 12,]
TotalQFrameGK[TotalQFrameGK$Var1 == 12,]
#Number of students in mid/final
nrow(DiemGK)
nrow(DiemCK)
#create data with 361 students(based on final)
#we will deal with 5 last students later
DiemGKCK<- cbind( DiemGK[1:361,],DiemCK)
#Ma de pool
md <- as.numeric(CKCDR[,1])
#add combined made
DiemGKCK$mdCK_GK <- as.numeric(paste(DiemGKCK[,29] ,DiemGKCK[,62], sep = ""))
#rearrange
DiemGKCK <- DiemGKCK[,c(63,1,4:28,33:61)]
colnames(DiemGKCK)[c(3:56)] <- c(1:54)
#rename column
GKCDR.colrename <-GKCDR
CKCDR.colrename <-CKCDR
colnames(GKCDR.colrename)[2:26] <- c(1:25)
colnames(CKCDR.colrename)[2:30] <- c(26:54)
MD1921.1921 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1921,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1921,-1])
MD1921.1922 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1921,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1922,-1])
MD1921.1923 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1921,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1923,-1])
MD1921.1924 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1921,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1924,-1])
MD1922.1921 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1922,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1921,-1])
MD1922.1922 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1922,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1922,-1])
MD1922.1923 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1922,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1923,-1])
MD1922.1924 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1922,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1924,-1])
MD1923.1921 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1923,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1921,-1])
MD1923.1922 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1923,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1922,-1])
MD1923.1923 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1923,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1923,-1])
MD1923.1924 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1923,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1924,-1])
MD1924.1921 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1924,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1921,-1])
MD1924.1922 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1924,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1922,-1])
MD1924.1923 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1924,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1923,-1])
MD1924.1924 <- cbind(GKCDR.colrename[GKCDR.colrename[1] == 1924,-1],
CKCDR.colrename[CKCDR.colrename[1] == 1924,-1])
ncol(MD1924.1924)
Diem1921.1921<-DiemGKCK[DiemGKCK[1] == 19211921,]
Diem1921.1922<-DiemGKCK[DiemGKCK[1] == 19211922,]
Diem1921.1923<-DiemGKCK[DiemGKCK[1] == 19211923,]
Diem1921.1924<-DiemGKCK[DiemGKCK[1] == 19211924,]
Diem1922.1921<-DiemGKCK[DiemGKCK[1] == 19221921,]
Diem1922.1922<-DiemGKCK[DiemGKCK[1] == 19221922,]
Diem1922.1923<-DiemGKCK[DiemGKCK[1] == 19221923,]
Diem1922.1924<-DiemGKCK[DiemGKCK[1] == 19221924,]
Diem1923.1921<-DiemGKCK[DiemGKCK[1] == 19231921,]
Diem1923.1922<-DiemGKCK[DiemGKCK[1] == 19231922,]
Diem1923.1923<-DiemGKCK[DiemGKCK[1] == 19231923,]
Diem1923.1924<-DiemGKCK[DiemGKCK[1] == 19231924,]
Diem1924.1921<-DiemGKCK[DiemGKCK[1] == 19241921,]
Diem1924.1922<-DiemGKCK[DiemGKCK[1] == 19241922,]
Diem1924.1923<-DiemGKCK[DiemGKCK[1] == 19241923,]
Diem1924.1924<-DiemGKCK[DiemGKCK[1] == 19241924,]
Diem1921.1921 <- apply(bind_rows(MD1921.1921,Diem1921.1921[,c(3:56)]),2,as.numeric)
Diem1921.1922 <- apply(bind_rows(MD1921.1922,Diem1921.1922[,c(3:56)]),2,as.numeric)
Diem1921.1923 <- apply(bind_rows(MD1921.1923,Diem1921.1923[,c(3:56)]),2,as.numeric)
Diem1921.1924 <- apply(bind_rows(MD1921.1924,Diem1921.1924[,c(3:56)]),2,as.numeric)
Diem1922.1921 <- apply(bind_rows(MD1922.1921,Diem1922.1921[,c(3:56)]),2,as.numeric)
Diem1922.1922 <- apply(bind_rows(MD1922.1922,Diem1922.1922[,c(3:56)]),2,as.numeric)
Diem1922.1923 <- apply(bind_rows(MD1922.1923,Diem1922.1923[,c(3:56)]),2,as.numeric)
Diem1922.1924 <- apply(bind_rows(MD1922.1924,Diem1922.1924[,c(3:56)]),2,as.numeric)
Diem1923.1921 <- apply(bind_rows(MD1923.1921,Diem1923.1921[,c(3:56)]),2,as.numeric)
Diem1923.1922 <- apply(bind_rows(MD1923.1922,Diem1923.1922[,c(3:56)]),2,as.numeric)
Diem1923.1923 <- apply(bind_rows(MD1923.1923,Diem1923.1923[,c(3:56)]),2,as.numeric)
Diem1923.1924 <- apply(bind_rows(MD1923.1924,Diem1923.1924[,c(3:56)]),2,as.numeric)
Diem1924.1921 <- apply(bind_rows(MD1924.1921,Diem1924.1921[,c(3:56)]),2,as.numeric)
Diem1924.1922 <- apply(bind_rows(MD1924.1922,Diem1924.1922[,c(3:56)]),2,as.numeric)
Diem1924.1923 <- apply(bind_rows(MD1924.1923,Diem1924.1923[,c(3:56)]),2,as.numeric)
Diem1924.1924 <- apply(bind_rows(MD1924.1924,Diem1924.1924[,c(3:56)]),2,as.numeric)
#last 5 students did midterm exam but did not do final exam
last5.1922 <- DiemGK[362:366,]
last5.1923 <- DiemGK[362:366,]
last5.1924 <- DiemGK[362:366,]
last5.1922 <- last5.1922 %>% filter(MADE==1922) %>% select(X1:X25) %>% apply(2,as.numeric)
last5.1923 <- last5.1923 %>% filter(MADE==1923) %>% select(X1:X25) %>% apply(2,as.numeric)
last5.1924 <- last5.1924 %>% filter(MADE==1924) %>% select(X1:X25) %>% apply(2,as.numeric)
last5.1922 <- as.data.frame(rbind(GKCDR.1922,last5.1922))
last5.1923 <- as.data.frame(rbind(GKCDR.1923,last5.1923))
last5.1924 <- as.data.frame(rbind(GKCDR.1924,last5.1924))
#Learning outcome 12
LO12.last5.1922 <- table(apply(last5.1922[-1,last5.1922[1,]==12],1,sum))
LO12.last5.1923 <- table(apply(last5.1923[-1,last5.1923[1,]==12],1,sum))
LO12.last5.1924 <- table(apply(last5.1924[-1,last5.1924[1,]==12],1,sum))
rownames(LO12.last5.1922) <- abs(as.numeric(rownames(LO12.last5.1922)) - ncol(GKCDR[GKCDR[,1]==1922,GKCDR[2,] == 12]))
rownames(LO12.last5.1923) <- abs(as.numeric(rownames(LO12.last5.1923)) - ncol(GKCDR[GKCDR[,1]==1923,GKCDR[2,] == 12]))
rownames(LO12.last5.1924) <- abs(as.numeric(rownames(LO12.last5.1924)) - ncol(GKCDR[GKCDR[,1]==1924,GKCDR[2,] == 12]))
LO12.Diem1921.1921 <- table(apply(Diem1921.1921[-1,Diem1921.1921[1,]==12],1,sum))
LO12.Diem1921.1922 <- table(apply(Diem1921.1922[-1,Diem1921.1922[1,]==12],1,sum))
LO12.Diem1921.1923 <- table(apply(Diem1921.1923[-1,Diem1921.1923[1,]==12],1,sum))
LO12.Diem1921.1924 <- table(apply(Diem1921.1924[-1,Diem1921.1924[1,]==12],1,sum))
LO12.Diem1922.1921 <- table(apply(Diem1922.1921[-1,Diem1922.1921[1,]==12],1,sum))
LO12.Diem1922.1922 <- table(apply(Diem1922.1922[-1,Diem1922.1922[1,]==12],1,sum))
LO12.Diem1922.1923 <- table(apply(Diem1922.1923[-1,Diem1922.1923[1,]==12],1,sum))
LO12.Diem1922.1924 <- table(apply(Diem1922.1924[-1,Diem1922.1924[1,]==12],1,sum))
LO12.Diem1923.1921 <- table(apply(Diem1923.1921[-1,Diem1923.1921[1,]==12],1,sum))
LO12.Diem1923.1922 <- table(apply(Diem1923.1922[-1,Diem1923.1922[1,]==12],1,sum))
LO12.Diem1923.1923 <- table(apply(Diem1923.1923[-1,Diem1923.1923[1,]==12],1,sum))
LO12.Diem1923.1924 <- table(apply(Diem1923.1924[-1,Diem1923.1924[1,]==12],1,sum))
LO12.Diem1924.1921 <- table(apply(Diem1924.1921[-1,Diem1924.1921[1,]==12],1,sum))
LO12.Diem1924.1922 <- table(apply(Diem1924.1922[-1,Diem1924.1922[1,]==12],1,sum))
LO12.Diem1924.1923 <- table(apply(Diem1924.1923[-1,Diem1924.1923[1,]==12],1,sum))
LO12.Diem1924.1924 <- table(apply(Diem1924.1924[-1,Diem1924.1924[1,]==12],1,sum))
#make count right answer -> wrong answer
rownames(LO12.Diem1921.1921) <- abs(as.numeric(rownames(LO12.Diem1921.1921)) - ncol(MD1921.1921[,MD1921.1921[1,]==12]))
rownames(LO12.Diem1921.1922) <- abs(as.numeric(rownames(LO12.Diem1921.1922)) - ncol(MD1921.1922[,MD1921.1922[1,]==12]))
rownames(LO12.Diem1921.1923) <- abs(as.numeric(rownames(LO12.Diem1921.1923)) - ncol(MD1921.1923[,MD1921.1923[1,]==12]))
rownames(LO12.Diem1921.1924) <- abs(as.numeric(rownames(LO12.Diem1921.1924)) - ncol(MD1921.1924[,MD1921.1924[1,]==12]))
#different is here
rownames(LO12.Diem1922.1921) <- abs(as.numeric(rownames(LO12.Diem1922.1921)) - ncol(MD1922.1921[,MD1922.1921[1,]==12]))
rownames(LO12.Diem1922.1922) <- abs(as.numeric(rownames(LO12.Diem1922.1922)) - ncol(MD1922.1922[,MD1922.1922[1,]==12]))
rownames(LO12.Diem1922.1923) <- abs(as.numeric(rownames(LO12.Diem1922.1923)) - ncol(MD1922.1923[,MD1922.1923[1,]==12]))
rownames(LO12.Diem1922.1924) <- abs(as.numeric(rownames(LO12.Diem1922.1924)) - ncol(MD1922.1924[,MD1922.1924[1,]==12]))
#-----------------
rownames(LO12.Diem1923.1921) <- abs(as.numeric(rownames(LO12.Diem1923.1921)) - ncol(MD1923.1921[,MD1923.1921[1,]==12]))
rownames(LO12.Diem1923.1922) <- abs(as.numeric(rownames(LO12.Diem1923.1922)) - ncol(MD1923.1922[,MD1923.1922[1,]==12]))
rownames(LO12.Diem1923.1923) <- abs(as.numeric(rownames(LO12.Diem1923.1923)) - ncol(MD1923.1923[,MD1923.1923[1,]==12]))
rownames(LO12.Diem1923.1924) <- abs(as.numeric(rownames(LO12.Diem1923.1924)) - ncol(MD1923.1924[,MD1923.1924[1,]==12]))
rownames(LO12.Diem1924.1921) <- abs(as.numeric(rownames(LO12.Diem1924.1921)) - ncol(MD1924.1921[,MD1924.1921[1,]==12]))
rownames(LO12.Diem1924.1922) <- abs(as.numeric(rownames(LO12.Diem1924.1922)) - ncol(MD1924.1922[,MD1924.1922[1,]==12]))
rownames(LO12.Diem1924.1923) <- abs(as.numeric(rownames(LO12.Diem1924.1923)) - ncol(MD1924.1923[,MD1924.1923[1,]==12]))
rownames(LO12.Diem1924.1924) <- abs(as.numeric(rownames(LO12.Diem1924.1924)) - ncol(MD1924.1924[,MD1924.1924[1,]==12]))
LOW12 <- as.data.frame(bind_rows(LO12.Diem1921.1921,
LO12.Diem1921.1922,
LO12.Diem1921.1923,
LO12.Diem1921.1924,
LO12.Diem1922.1921,
LO12.Diem1922.1922,
LO12.Diem1922.1923,
LO12.Diem1922.1924,
LO12.Diem1923.1921,
LO12.Diem1923.1922,
LO12.Diem1923.1923,
LO12.Diem1923.1924,
LO12.Diem1924.1921,
LO12.Diem1924.1922,
LO12.Diem1924.1923,
LO12.Diem1924.1924,
LO12.last5.1922,
LO12.last5.1923,
LO12.last5.1924
))
LOW12[is.na(LOW12)] <- 0
LOW12 <- as.data.frame(apply(LOW12,2,sum))
LOW12$SoCauTLSai <- as.numeric(row.names(LOW12))
LOW12$percent <- round(LOW12[,1]/sum(LOW12[,1]),3)
#graph----
GLOW12 <- ggplot(LOW12, aes(x = as.character(LOW12[,2]), y = LOW12[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW12[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 12", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
#Learning outcome 23
#expected to be 1
LO23.last5.1922 <- table(last5.1922[-1,last5.1922[1,]==23])
#mini conclude: 1 question related to LO23 on Made1922 was answer by 1 student
#and his/her answer was right -> LO23.last5.1922 = 0.(no need to add to combined)
LO23.Diem1921.1921 <- table(apply(Diem1921.1921[-1,Diem1921.1921[1,]==23],1,sum))
LO23.Diem1921.1922 <- table(apply(Diem1921.1922[-1,Diem1921.1922[1,]==23],1,sum))
LO23.Diem1921.1923 <- table(apply(Diem1921.1923[-1,Diem1921.1923[1,]==23],1,sum))
LO23.Diem1921.1924 <- table(apply(Diem1921.1924[-1,Diem1921.1924[1,]==23],1,sum))
LO23.Diem1922.1921 <- table(apply(Diem1922.1921[-1,Diem1922.1921[1,]==23],1,sum))
LO23.Diem1922.1922 <- table(apply(Diem1922.1922[-1,Diem1922.1922[1,]==23],1,sum))
LO23.Diem1922.1923 <- table(apply(Diem1922.1923[-1,Diem1922.1923[1,]==23],1,sum))
LO23.Diem1922.1924 <- table(apply(Diem1922.1924[-1,Diem1922.1924[1,]==23],1,sum))
LO23.Diem1923.1921 <- table(apply(Diem1923.1921[-1,Diem1923.1921[1,]==23],1,sum))
LO23.Diem1923.1922 <- table(apply(Diem1923.1922[-1,Diem1923.1922[1,]==23],1,sum))
LO23.Diem1923.1923 <- table(apply(Diem1923.1923[-1,Diem1923.1923[1,]==23],1,sum))
LO23.Diem1923.1924 <- table(apply(Diem1923.1924[-1,Diem1923.1924[1,]==23],1,sum))
LO23.Diem1924.1921 <- table(apply(Diem1924.1921[-1,Diem1924.1921[1,]==23],1,sum))
LO23.Diem1924.1922 <- table(apply(Diem1924.1922[-1,Diem1924.1922[1,]==23],1,sum))
LO23.Diem1924.1923 <- table(apply(Diem1924.1923[-1,Diem1924.1923[1,]==23],1,sum))
LO23.Diem1924.1924 <- table(apply(Diem1924.1924[-1,Diem1924.1924[1,]==23],1,sum))
#make count right answer -> wrong answer
rownames(LO23.Diem1921.1921) <- abs(as.numeric(rownames(LO23.Diem1921.1921)) - ncol(MD1921.1921[,MD1921.1921[1,]==23]))
rownames(LO23.Diem1921.1922) <- abs(as.numeric(rownames(LO23.Diem1921.1922)) - ncol(MD1921.1922[,MD1921.1922[1,]==23]))
rownames(LO23.Diem1921.1923) <- abs(as.numeric(rownames(LO23.Diem1921.1923)) - ncol(MD1921.1923[,MD1921.1923[1,]==23]))
rownames(LO23.Diem1921.1924) <- abs(as.numeric(rownames(LO23.Diem1921.1924)) - ncol(MD1921.1924[,MD1921.1924[1,]==23]))
#different is here
rownames(LO23.Diem1922.1921) <- abs(as.numeric(rownames(LO23.Diem1922.1921)) - ncol(MD1922.1921[,MD1922.1921[1,]==23]))
rownames(LO23.Diem1922.1922) <- abs(as.numeric(rownames(LO23.Diem1922.1922)) - ncol(MD1922.1922[,MD1922.1922[1,]==23]))
rownames(LO23.Diem1922.1923) <- abs(as.numeric(rownames(LO23.Diem1922.1923)) - ncol(MD1922.1923[,MD1922.1923[1,]==23]))
rownames(LO23.Diem1922.1924) <- abs(as.numeric(rownames(LO23.Diem1922.1924)) - ncol(MD1922.1924[,MD1922.1924[1,]==23]))
#-----------------
rownames(LO23.Diem1923.1921) <- abs(as.numeric(rownames(LO23.Diem1923.1921)) - ncol(MD1923.1921[,MD1923.1921[1,]==23]))
rownames(LO23.Diem1923.1922) <- abs(as.numeric(rownames(LO23.Diem1923.1922)) - ncol(MD1923.1922[,MD1923.1922[1,]==23]))
rownames(LO23.Diem1923.1923) <- abs(as.numeric(rownames(LO23.Diem1923.1923)) - ncol(MD1923.1923[,MD1923.1923[1,]==23]))
rownames(LO23.Diem1923.1924) <- abs(as.numeric(rownames(LO23.Diem1923.1924)) - ncol(MD1923.1924[,MD1923.1924[1,]==23]))
rownames(LO23.Diem1924.1921) <- abs(as.numeric(rownames(LO23.Diem1924.1921)) - ncol(MD1924.1921[,MD1924.1921[1,]==23]))
rownames(LO23.Diem1924.1922) <- abs(as.numeric(rownames(LO23.Diem1924.1922)) - ncol(MD1924.1922[,MD1924.1922[1,]==23]))
rownames(LO23.Diem1924.1923) <- abs(as.numeric(rownames(LO23.Diem1924.1923)) - ncol(MD1924.1923[,MD1924.1923[1,]==23]))
rownames(LO23.Diem1924.1924) <- abs(as.numeric(rownames(LO23.Diem1924.1924)) - ncol(MD1924.1924[,MD1924.1924[1,]==23]))
LOW23 <- as.data.frame(bind_rows(LO23.Diem1921.1921,
LO23.Diem1921.1922,
LO23.Diem1921.1923,
LO23.Diem1921.1924,
LO23.Diem1922.1921,
LO23.Diem1922.1922,
LO23.Diem1922.1923,
LO23.Diem1922.1924,
LO23.Diem1923.1921,
LO23.Diem1923.1922,
LO23.Diem1923.1923,
LO23.Diem1923.1924,
LO23.Diem1924.1921,
LO23.Diem1924.1922,
LO23.Diem1924.1923,
LO23.Diem1924.1924,
))
LOW23[is.na(LOW23)] <- 0
LOW23 <- as.data.frame(apply(LOW23,2,sum))
LOW23$SoCauTLSai <- as.numeric(row.names(LOW23))
LOW23$percent <- round(LOW23[,1]/sum(LOW23[,1]),3)
#graph----
GLOW23 <- ggplot(LOW23, aes(x = as.character(LOW23[,2]), y = LOW23[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW23[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 23", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
#Learning outcome 31
LO31.last5.1922 <- table(apply(last5.1922[-1,last5.1922[1,]==31],1,sum))
LO31.last5.1923 <- table(apply(last5.1923[-1,last5.1923[1,]==31],1,sum))
LO31.last5.1924 <- table(apply(last5.1924[-1,last5.1924[1,]==31],1,sum))
rownames(LO31.last5.1922) <- abs(as.numeric(rownames(LO31.last5.1922)) - ncol(GKCDR[GKCDR[,1]==1922,GKCDR[2,] == 31]))
rownames(LO31.last5.1923) <- abs(as.numeric(rownames(LO31.last5.1923)) - ncol(GKCDR[GKCDR[,1]==1923,GKCDR[2,] == 31]))
rownames(LO31.last5.1924) <- abs(as.numeric(rownames(LO31.last5.1924)) - ncol(GKCDR[GKCDR[,1]==1924,GKCDR[2,] == 31]))
LO31.Diem1921.1921 <- table(apply(Diem1921.1921[-1,Diem1921.1921[1,]==31],1,sum))
LO31.Diem1921.1922 <- table(apply(Diem1921.1922[-1,Diem1921.1922[1,]==31],1,sum))
LO31.Diem1921.1923 <- table(apply(Diem1921.1923[-1,Diem1921.1923[1,]==31],1,sum))
LO31.Diem1921.1924 <- table(apply(Diem1921.1924[-1,Diem1921.1924[1,]==31],1,sum))
LO31.Diem1922.1921 <- table(apply(Diem1922.1921[-1,Diem1922.1921[1,]==31],1,sum))
LO31.Diem1922.1922 <- table(apply(Diem1922.1922[-1,Diem1922.1922[1,]==31],1,sum))
LO31.Diem1922.1923 <- table(apply(Diem1922.1923[-1,Diem1922.1923[1,]==31],1,sum))
LO31.Diem1922.1924 <- table(apply(Diem1922.1924[-1,Diem1922.1924[1,]==31],1,sum))
LO31.Diem1923.1921 <- table(apply(Diem1923.1921[-1,Diem1923.1921[1,]==31],1,sum))
LO31.Diem1923.1922 <- table(apply(Diem1923.1922[-1,Diem1923.1922[1,]==31],1,sum))
LO31.Diem1923.1923 <- table(apply(Diem1923.1923[-1,Diem1923.1923[1,]==31],1,sum))
LO31.Diem1923.1924 <- table(apply(Diem1923.1924[-1,Diem1923.1924[1,]==31],1,sum))
LO31.Diem1924.1921 <- table(apply(Diem1924.1921[-1,Diem1924.1921[1,]==31],1,sum))
LO31.Diem1924.1922 <- table(apply(Diem1924.1922[-1,Diem1924.1922[1,]==31],1,sum))
LO31.Diem1924.1923 <- table(apply(Diem1924.1923[-1,Diem1924.1923[1,]==31],1,sum))
LO31.Diem1924.1924 <- table(apply(Diem1924.1924[-1,Diem1924.1924[1,]==31],1,sum))
#make count right answer -> wrong answer
rownames(LO31.Diem1921.1921) <- abs(as.numeric(rownames(LO31.Diem1921.1921)) - ncol(MD1921.1921[,MD1921.1921[1,]==31]))
rownames(LO31.Diem1921.1922) <- abs(as.numeric(rownames(LO31.Diem1921.1922)) - ncol(MD1921.1922[,MD1921.1922[1,]==31]))
rownames(LO31.Diem1921.1923) <- abs(as.numeric(rownames(LO31.Diem1921.1923)) - ncol(MD1921.1923[,MD1921.1923[1,]==31]))
rownames(LO31.Diem1921.1924) <- abs(as.numeric(rownames(LO31.Diem1921.1924)) - ncol(MD1921.1924[,MD1921.1924[1,]==31]))
rownames(LO31.Diem1922.1921) <- abs(as.numeric(rownames(LO31.Diem1922.1921)) - ncol(MD1922.1921[,MD1922.1921[1,]==31]))
rownames(LO31.Diem1922.1922) <- abs(as.numeric(rownames(LO31.Diem1922.1922)) - ncol(MD1922.1922[,MD1922.1922[1,]==31]))
rownames(LO31.Diem1922.1923) <- abs(as.numeric(rownames(LO31.Diem1922.1923)) - ncol(MD1922.1923[,MD1922.1923[1,]==31]))
rownames(LO31.Diem1922.1924) <- abs(as.numeric(rownames(LO31.Diem1922.1924)) - ncol(MD1922.1924[,MD1922.1924[1,]==31]))
#-----------------
rownames(LO31.Diem1923.1921) <- abs(as.numeric(rownames(LO31.Diem1923.1921)) - ncol(MD1923.1921[,MD1923.1921[1,]==31]))
rownames(LO31.Diem1923.1922) <- abs(as.numeric(rownames(LO31.Diem1923.1922)) - ncol(MD1923.1922[,MD1923.1922[1,]==31]))
rownames(LO31.Diem1923.1923) <- abs(as.numeric(rownames(LO31.Diem1923.1923)) - ncol(MD1923.1923[,MD1923.1923[1,]==31]))
rownames(LO31.Diem1923.1924) <- abs(as.numeric(rownames(LO31.Diem1923.1924)) - ncol(MD1923.1924[,MD1923.1924[1,]==31]))
rownames(LO31.Diem1924.1921) <- abs(as.numeric(rownames(LO31.Diem1924.1921)) - ncol(MD1924.1921[,MD1924.1921[1,]==31]))
rownames(LO31.Diem1924.1922) <- abs(as.numeric(rownames(LO31.Diem1924.1922)) - ncol(MD1924.1922[,MD1924.1922[1,]==31]))
rownames(LO31.Diem1924.1923) <- abs(as.numeric(rownames(LO31.Diem1924.1923)) - ncol(MD1924.1923[,MD1924.1923[1,]==31]))
rownames(LO31.Diem1924.1924) <- abs(as.numeric(rownames(LO31.Diem1924.1924)) - ncol(MD1924.1924[,MD1924.1924[1,]==31]))
LOW31 <- as.data.frame(bind_rows(LO31.Diem1921.1921,
LO31.Diem1921.1922,
LO31.Diem1921.1923,
LO31.Diem1921.1924,
LO31.Diem1922.1921,
LO31.Diem1922.1922,
LO31.Diem1922.1923,
LO31.Diem1922.1924,
LO31.Diem1923.1921,
LO31.Diem1923.1922,
LO31.Diem1923.1923,
LO31.Diem1923.1924,
LO31.Diem1924.1921,
LO31.Diem1924.1922,
LO31.Diem1924.1923,
LO31.Diem1924.1924,
LO31.last5.1922,
LO31.last5.1923,
LO31.last5.1924
))
LOW31[is.na(LOW31)] <- 0
LOW31 <- as.data.frame(apply(LOW31,2,sum))
LOW31$SoCauTLSai <- as.numeric(row.names(LOW31))
LOW31$percent <- round(LOW31[,1]/sum(LOW31[,1]),3)
GLOW31 <- ggplot(LOW31, aes(x = as.character(LOW31[,2]), y = LOW31[,3])) + geom_bar(stat = "identity") + geom_text(aes(label=LOW31[,3]), vjust=-0.3, size=3.5, )+
labs(title = "Learning Outcome 31", x = "So cau tra loi sai", y = "tan suat tuong duong") + theme(panel.background = element_rect(fill = "#d557d5"))
#graph----
GW <- ggarrange(GLOW.GK11, GLOW12, GLOW.GK21, GLOW.GK22, GLOW23, GLOW31, GLOW.CK32, ncol=2, nrow = 4)
GW

Phan V
# Cau VI.2
# Gan p = 1
p <- 1
#reuse DiemGK & DiemCK
DiemGKCK.2<- cbind( DiemGK[1:361,],DiemCK)
#add combined made
DiemGKCK.2$mdCK_GK <- as.numeric(paste(DiemGKCK.2[,29] ,DiemGKCK.2[,62], sep = ""))
#rearrange
DiemGKCK.2 <- DiemGKCK.2[,c(63,1:28, 33:61)]
colnames(DiemGKCK.2)[c(5:29)] <- c(1:25)
colnames(DiemGKCK.2)[c(30:58)] <- c(26:54)
Diem2.1921.1921 <- apply(bind_rows(MD1921.1921,DiemGKCK.2[DiemGKCK.2[1] == 19211921,c(2,5:58)]),2,as.numeric)
Diem2.1921.1922 <- apply(bind_rows(MD1921.1922,DiemGKCK.2[DiemGKCK.2[1] == 19211922,c(2,5:58)]),2,as.numeric)
Diem2.1921.1923 <- apply(bind_rows(MD1921.1923,DiemGKCK.2[DiemGKCK.2[1] == 19211923,c(2,5:58)]),2,as.numeric)
Diem2.1921.1924 <- apply(bind_rows(MD1921.1924,DiemGKCK.2[DiemGKCK.2[1] == 19211924,c(2,5:58)]),2,as.numeric)
Diem2.1922.1921 <- apply(bind_rows(MD1922.1921,DiemGKCK.2[DiemGKCK.2[1] == 19221921,c(2,5:58)]),2,as.numeric)
Diem2.1922.1922 <- apply(bind_rows(MD1922.1922,DiemGKCK.2[DiemGKCK.2[1] == 19221922,c(2,5:58)]),2,as.numeric)
Diem2.1922.1923 <- apply(bind_rows(MD1922.1923,DiemGKCK.2[DiemGKCK.2[1] == 19221923,c(2,5:58)]),2,as.numeric)
Diem2.1922.1924 <- apply(bind_rows(MD1922.1924,DiemGKCK.2[DiemGKCK.2[1] == 19221924,c(2,5:58)]),2,as.numeric)
Diem2.1923.1921 <- apply(bind_rows(MD1923.1921,DiemGKCK.2[DiemGKCK.2[1] == 19231921,c(2,5:58)]),2,as.numeric)
Diem2.1923.1922 <- apply(bind_rows(MD1923.1922,DiemGKCK.2[DiemGKCK.2[1] == 19231922,c(2,5:58)]),2,as.numeric)
Diem2.1923.1923 <- apply(bind_rows(MD1923.1923,DiemGKCK.2[DiemGKCK.2[1] == 19231923,c(2,5:58)]),2,as.numeric)
Diem2.1923.1924 <- apply(bind_rows(MD1923.1924,DiemGKCK.2[DiemGKCK.2[1] == 19231924,c(2,5:58)]),2,as.numeric)
Diem2.1924.1921 <- apply(bind_rows(MD1924.1921,DiemGKCK.2[DiemGKCK.2[1] == 19241921,c(2,5:58)]),2,as.numeric)
Diem2.1924.1922 <- apply(bind_rows(MD1924.1922,DiemGKCK.2[DiemGKCK.2[1] == 19241922,c(2,5:58)]),2,as.numeric)
Diem2.1924.1923 <- apply(bind_rows(MD1924.1923,DiemGKCK.2[DiemGKCK.2[1] == 19241923,c(2,5:58)]),2,as.numeric)
Diem2.1924.1924 <- apply(bind_rows(MD1924.1924,DiemGKCK.2[DiemGKCK.2[1] == 19241924,c(2,5:58)]),2,as.numeric)
Diem2.LO12.1921.1921 <- as.data.frame(Diem2.1921.1921[,Diem2.1921.1921[1,] == 12 | is.na(Diem2.1921.1921[1,])])
Diem2.LO12.1921.1922 <- as.data.frame(Diem2.1921.1922[,Diem2.1921.1922[1,] == 12 | is.na(Diem2.1921.1922[1,])])
Diem2.LO12.1921.1923 <- as.data.frame(Diem2.1921.1923[,Diem2.1921.1923[1,] == 12 | is.na(Diem2.1921.1923[1,])])
Diem2.LO12.1921.1924 <- as.data.frame(Diem2.1921.1924[,Diem2.1921.1924[1,] == 12 | is.na(Diem2.1921.1924[1,])])
Diem2.LO12.1922.1921 <- as.data.frame(Diem2.1922.1921[,Diem2.1922.1921[1,] == 12 | is.na(Diem2.1922.1921[1,])])
Diem2.LO12.1922.1922 <- as.data.frame(Diem2.1922.1922[,Diem2.1922.1922[1,] == 12 | is.na(Diem2.1922.1922[1,])])
Diem2.LO12.1922.1923 <- as.data.frame(Diem2.1922.1923[,Diem2.1922.1923[1,] == 12 | is.na(Diem2.1922.1923[1,])])
Diem2.LO12.1922.1924 <- as.data.frame(Diem2.1922.1924[,Diem2.1922.1924[1,] == 12 | is.na(Diem2.1922.1924[1,])])
Diem2.LO12.1923.1921 <- as.data.frame(Diem2.1923.1921[,Diem2.1923.1921[1,] == 12 | is.na(Diem2.1923.1921[1,])])
Diem2.LO12.1923.1922 <- as.data.frame(Diem2.1923.1922[,Diem2.1923.1922[1,] == 12 | is.na(Diem2.1923.1922[1,])])
Diem2.LO12.1923.1923 <- as.data.frame(Diem2.1923.1923[,Diem2.1923.1923[1,] == 12 | is.na(Diem2.1923.1923[1,])])
Diem2.LO12.1923.1924 <- as.data.frame(Diem2.1923.1924[,Diem2.1923.1924[1,] == 12 | is.na(Diem2.1923.1924[1,])])
Diem2.LO12.1924.1921 <- as.data.frame(Diem2.1924.1921[,Diem2.1924.1921[1,] == 12 | is.na(Diem2.1924.1921[1,])])
Diem2.LO12.1924.1922 <- as.data.frame(Diem2.1924.1922[,Diem2.1924.1922[1,] == 12 | is.na(Diem2.1924.1922[1,])])
Diem2.LO12.1924.1923 <- as.data.frame(Diem2.1924.1923[,Diem2.1924.1923[1,] == 12 | is.na(Diem2.1924.1923[1,])])
Diem2.LO12.1924.1924 <- as.data.frame(Diem2.1924.1924[,Diem2.1924.1924[1,] == 12 | is.na(Diem2.1924.1924[1,])])
Diem2.LO12.1921.1921$TLD<- apply(Diem2.LO12.1921.1921[,c(1:ncol(MD1921.1921[,MD1921.1921 == 12]))],1,sum)
Diem2.LO12.1921.1921[Diem2.LO12.1921.1921[-1,"TLD"] >= ncol(MD1921.1921[,MD1921.1921 == 12]) - p,"NO"]
NULL
Diem2.LO12.1921.1921$TLD <- apply(Diem2.LO12.1921.1921[,c(1:ncol(MD1921.1921[,MD1921.1921 == 12]))],1,sum)
Diem2.LO12.1921.1922$TLD <- apply(Diem2.LO12.1921.1922[,c(1:ncol(MD1921.1922[,MD1921.1922 == 12]))],1,sum)
Diem2.LO12.1921.1923$TLD <- apply(Diem2.LO12.1921.1923[,c(1:ncol(MD1921.1923[,MD1921.1923 == 12]))],1,sum)
Diem2.LO12.1921.1924$TLD <- apply(Diem2.LO12.1921.1924[,c(1:ncol(MD1921.1924[,MD1921.1924 == 12]))],1,sum)
Diem2.LO12.1922.1921$TLD <- apply(Diem2.LO12.1922.1921[,c(1:ncol(MD1922.1921[,MD1922.1921 == 12]))],1,sum)
Diem2.LO12.1922.1922$TLD <- apply(Diem2.LO12.1922.1922[,c(1:ncol(MD1922.1922[,MD1922.1922 == 12]))],1,sum)
Diem2.LO12.1922.1923$TLD <- apply(Diem2.LO12.1922.1923[,c(1:ncol(MD1922.1923[,MD1922.1923 == 12]))],1,sum)
Diem2.LO12.1922.1924$TLD <- apply(Diem2.LO12.1922.1924[,c(1:ncol(MD1922.1924[,MD1922.1924 == 12]))],1,sum)
Diem2.LO12.1923.1921$TLD <- apply(Diem2.LO12.1923.1921[,c(1:ncol(MD1923.1921[,MD1923.1921 == 12]))],1,sum)
Diem2.LO12.1923.1922$TLD <- apply(Diem2.LO12.1923.1922[,c(1:ncol(MD1923.1922[,MD1923.1922 == 12]))],1,sum)
Diem2.LO12.1923.1923$TLD <- apply(Diem2.LO12.1923.1923[,c(1:ncol(MD1923.1923[,MD1923.1923 == 12]))],1,sum)
Diem2.LO12.1923.1924$TLD <- apply(Diem2.LO12.1923.1924[,c(1:ncol(MD1923.1924[,MD1923.1924 == 12]))],1,sum)
Diem2.LO12.1924.1921$TLD <- apply(Diem2.LO12.1924.1921[,c(1:ncol(MD1924.1921[,MD1924.1921 == 12]))],1,sum)
Diem2.LO12.1924.1922$TLD <- apply(Diem2.LO12.1924.1922[,c(1:ncol(MD1924.1922[,MD1924.1922 == 12]))],1,sum)
Diem2.LO12.1924.1923$TLD <- apply(Diem2.LO12.1924.1923[,c(1:ncol(MD1924.1923[,MD1924.1923 == 12]))],1,sum)
Diem2.LO12.1924.1924$TLD <- apply(Diem2.LO12.1924.1924[,c(1:ncol(MD1924.1924[,MD1924.1924 == 12]))],1,sum)
#list of student meets learning outcome 12 result requirement
LO12SVList <- ("SV")
LO12SVList <- c(LO12SVList,Diem2.LO12.1921.1921[Diem2.LO12.1921.1921[,"TLD"] >= ncol(MD1921.1921[,MD1921.1921 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1921.1922[Diem2.LO12.1921.1922[,"TLD"] >= ncol(MD1921.1922[,MD1921.1922 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1921.1923[Diem2.LO12.1921.1923[,"TLD"] >= ncol(MD1921.1923[,MD1921.1923 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1921.1924[Diem2.LO12.1921.1924[,"TLD"] >= ncol(MD1921.1924[,MD1921.1924 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1922.1921[Diem2.LO12.1922.1921[,"TLD"] >= ncol(MD1922.1921[,MD1922.1921 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1922.1922[Diem2.LO12.1922.1922[,"TLD"] >= ncol(MD1922.1922[,MD1922.1922 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1922.1923[Diem2.LO12.1922.1923[,"TLD"] >= ncol(MD1922.1923[,MD1922.1923 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1922.1924[Diem2.LO12.1922.1924[,"TLD"] >= ncol(MD1922.1924[,MD1922.1924 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1923.1921[Diem2.LO12.1923.1921[,"TLD"] >= ncol(MD1923.1921[,MD1923.1921 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1923.1922[Diem2.LO12.1923.1922[,"TLD"] >= ncol(MD1923.1922[,MD1923.1922 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1923.1923[Diem2.LO12.1923.1923[,"TLD"] >= ncol(MD1923.1923[,MD1923.1923 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1923.1924[Diem2.LO12.1923.1924[,"TLD"] >= ncol(MD1923.1924[,MD1923.1924 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1924.1921[Diem2.LO12.1924.1921[,"TLD"] >= ncol(MD1924.1921[,MD1924.1921 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1924.1922[Diem2.LO12.1924.1922[,"TLD"] >= ncol(MD1924.1922[,MD1924.1922 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1924.1923[Diem2.LO12.1924.1923[,"TLD"] >= ncol(MD1924.1923[,MD1924.1923 == 12]) - p,"No" ])
LO12SVList <- c(LO12SVList,Diem2.LO12.1924.1924[Diem2.LO12.1924.1924[,"TLD"] >= ncol(MD1924.1924[,MD1924.1924 == 12]) - p,"No" ])
#list of student meets learning outcome 12 result requirement
LO12SVList
[1] "SV" NA NA NA NA "110" NA NA NA NA NA "260"
[13] NA NA NA NA "107" NA NA NA
na.omit(as.data.frame(LO12SVList))
Diem2.LO31.1921.1921 <- as.data.frame(Diem2.1921.1921[,Diem2.1921.1921[1,] == 31 | is.na(Diem2.1921.1921[1,])])
Diem2.LO31.1921.1922 <- as.data.frame(Diem2.1921.1922[,Diem2.1921.1922[1,] == 31 | is.na(Diem2.1921.1922[1,])])
Diem2.LO31.1921.1923 <- as.data.frame(Diem2.1921.1923[,Diem2.1921.1923[1,] == 31 | is.na(Diem2.1921.1923[1,])])
Diem2.LO31.1921.1924 <- as.data.frame(Diem2.1921.1924[,Diem2.1921.1924[1,] == 31 | is.na(Diem2.1921.1924[1,])])
Diem2.LO31.1922.1921 <- as.data.frame(Diem2.1922.1921[,Diem2.1922.1921[1,] == 31 | is.na(Diem2.1922.1921[1,])])
Diem2.LO31.1922.1922 <- as.data.frame(Diem2.1922.1922[,Diem2.1922.1922[1,] == 31 | is.na(Diem2.1922.1922[1,])])
Diem2.LO31.1922.1923 <- as.data.frame(Diem2.1922.1923[,Diem2.1922.1923[1,] == 31 | is.na(Diem2.1922.1923[1,])])
Diem2.LO31.1922.1924 <- as.data.frame(Diem2.1922.1924[,Diem2.1922.1924[1,] == 31 | is.na(Diem2.1922.1924[1,])])
Diem2.LO31.1923.1921 <- as.data.frame(Diem2.1923.1921[,Diem2.1923.1921[1,] == 31 | is.na(Diem2.1923.1921[1,])])
Diem2.LO31.1923.1922 <- as.data.frame(Diem2.1923.1922[,Diem2.1923.1922[1,] == 31 | is.na(Diem2.1923.1922[1,])])
Diem2.LO31.1923.1923 <- as.data.frame(Diem2.1923.1923[,Diem2.1923.1923[1,] == 31 | is.na(Diem2.1923.1923[1,])])
Diem2.LO31.1923.1924 <- as.data.frame(Diem2.1923.1924[,Diem2.1923.1924[1,] == 31 | is.na(Diem2.1923.1924[1,])])
Diem2.LO31.1924.1921 <- as.data.frame(Diem2.1924.1921[,Diem2.1924.1921[1,] == 31 | is.na(Diem2.1924.1921[1,])])
Diem2.LO31.1924.1922 <- as.data.frame(Diem2.1924.1922[,Diem2.1924.1922[1,] == 31 | is.na(Diem2.1924.1922[1,])])
Diem2.LO31.1924.1923 <- as.data.frame(Diem2.1924.1923[,Diem2.1924.1923[1,] == 31 | is.na(Diem2.1924.1923[1,])])
Diem2.LO31.1924.1924 <- as.data.frame(Diem2.1924.1924[,Diem2.1924.1924[1,] == 31 | is.na(Diem2.1924.1924[1,])])
Diem2.LO31.1921.1921$TLD<- apply(Diem2.LO31.1921.1921[,c(1:ncol(MD1921.1921[,MD1921.1921 == 31]))],1,sum)
Diem2.LO31.1921.1921[Diem2.LO31.1921.1921[-1,"TLD"] >= ncol(MD1921.1921[,MD1921.1921 == 31]) - p,"NO"]
NULL
Diem2.LO31.1921.1921$TLD <- apply(Diem2.LO31.1921.1921[,c(1:ncol(MD1921.1921[,MD1921.1921 == 31]))],1,sum)
Diem2.LO31.1921.1922$TLD <- apply(Diem2.LO31.1921.1922[,c(1:ncol(MD1921.1922[,MD1921.1922 == 31]))],1,sum)
Diem2.LO31.1921.1923$TLD <- apply(Diem2.LO31.1921.1923[,c(1:ncol(MD1921.1923[,MD1921.1923 == 31]))],1,sum)
Diem2.LO31.1921.1924$TLD <- apply(Diem2.LO31.1921.1924[,c(1:ncol(MD1921.1924[,MD1921.1924 == 31]))],1,sum)
Diem2.LO31.1922.1921$TLD <- apply(Diem2.LO31.1922.1921[,c(1:ncol(MD1922.1921[,MD1922.1921 == 31]))],1,sum)
Diem2.LO31.1922.1922$TLD <- apply(Diem2.LO31.1922.1922[,c(1:ncol(MD1922.1922[,MD1922.1922 == 31]))],1,sum)
Diem2.LO31.1922.1923$TLD <- apply(Diem2.LO31.1922.1923[,c(1:ncol(MD1922.1923[,MD1922.1923 == 31]))],1,sum)
Diem2.LO31.1922.1924$TLD <- apply(Diem2.LO31.1922.1924[,c(1:ncol(MD1922.1924[,MD1922.1924 == 31]))],1,sum)
Diem2.LO31.1923.1921$TLD <- apply(Diem2.LO31.1923.1921[,c(1:ncol(MD1923.1921[,MD1923.1921 == 31]))],1,sum)
Diem2.LO31.1923.1922$TLD <- apply(Diem2.LO31.1923.1922[,c(1:ncol(MD1923.1922[,MD1923.1922 == 31]))],1,sum)
Diem2.LO31.1923.1923$TLD <- apply(Diem2.LO31.1923.1923[,c(1:ncol(MD1923.1923[,MD1923.1923 == 31]))],1,sum)
Diem2.LO31.1923.1924$TLD <- apply(Diem2.LO31.1923.1924[,c(1:ncol(MD1923.1924[,MD1923.1924 == 31]))],1,sum)
Diem2.LO31.1924.1921$TLD <- apply(Diem2.LO31.1924.1921[,c(1:ncol(MD1924.1921[,MD1924.1921 == 31]))],1,sum)
Diem2.LO31.1924.1922$TLD <- apply(Diem2.LO31.1924.1922[,c(1:ncol(MD1924.1922[,MD1924.1922 == 31]))],1,sum)
Diem2.LO31.1924.1923$TLD <- apply(Diem2.LO31.1924.1923[,c(1:ncol(MD1924.1923[,MD1924.1923 == 31]))],1,sum)
Diem2.LO31.1924.1924$TLD <- apply(Diem2.LO31.1924.1924[,c(1:ncol(MD1924.1924[,MD1924.1924 == 31]))],1,sum)
#list of student meets learning outcome 31 result requirement
LO31SVList <- "SV"
LO31SVList <- c(LO31SVList,Diem2.LO31.1921.1921[Diem2.LO31.1921.1921[,"TLD"] >= ncol(MD1921.1921[,MD1921.1921 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1921.1922[Diem2.LO31.1921.1922[,"TLD"] >= ncol(MD1921.1922[,MD1921.1922 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1921.1923[Diem2.LO31.1921.1923[,"TLD"] >= ncol(MD1921.1923[,MD1921.1923 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1921.1924[Diem2.LO31.1921.1924[,"TLD"] >= ncol(MD1921.1924[,MD1921.1924 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1922.1921[Diem2.LO31.1922.1921[,"TLD"] >= ncol(MD1922.1921[,MD1922.1921 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1922.1922[Diem2.LO31.1922.1922[,"TLD"] >= ncol(MD1922.1922[,MD1922.1922 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1922.1923[Diem2.LO31.1922.1923[,"TLD"] >= ncol(MD1922.1923[,MD1922.1923 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1922.1924[Diem2.LO31.1922.1924[,"TLD"] >= ncol(MD1922.1924[,MD1922.1924 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1923.1921[Diem2.LO31.1923.1921[,"TLD"] >= ncol(MD1923.1921[,MD1923.1921 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1923.1922[Diem2.LO31.1923.1922[,"TLD"] >= ncol(MD1923.1922[,MD1923.1922 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1923.1923[Diem2.LO31.1923.1923[,"TLD"] >= ncol(MD1923.1923[,MD1923.1923 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1923.1924[Diem2.LO31.1923.1924[,"TLD"] >= ncol(MD1923.1924[,MD1923.1924 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1924.1921[Diem2.LO31.1924.1921[,"TLD"] >= ncol(MD1924.1921[,MD1924.1921 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1924.1922[Diem2.LO31.1924.1922[,"TLD"] >= ncol(MD1924.1922[,MD1924.1922 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1924.1923[Diem2.LO31.1924.1923[,"TLD"] >= ncol(MD1924.1923[,MD1924.1923 == 31]) - p,"No" ])
LO31SVList <- c(LO31SVList,Diem2.LO31.1924.1924[Diem2.LO31.1924.1924[,"TLD"] >= ncol(MD1924.1924[,MD1924.1924 == 31]) - p,"No" ])
#list of student meets learning outcome 31 result requirement
LO31SVList
[1] "SV" NA "63" "123" "313" "345" NA "49" "152" "205" "316" NA
[13] "42" "73" "103" "108" "164" "296" "321" "333" NA "60" "71" "91"
[25] "101" "140" "288" "318" NA "11" "20" "25" "70" "80" "159" "209"
[37] "275" "319" NA "17" "43" "48" "59" "67" "104" "116" "147" "274"
[49] "283" "312" "342" "344" "353" NA "90" "93" "225" "323" NA "68"
[61] "83" "87" "120" "189" "251" "310" "320" NA "45" "88" "139" "161"
[73] "252" "260" "299" NA "28" "55" "94" "109" "136" "149" "236" "246"
[85] "271" "354" NA "21" "37" "39" "65" "74" "132" "191" "220" "266"
[97] "273" "311" "341" NA "15" "106" "126" "148" "170" "175" "238" "355"
[109] NA "22" "107" "196" "207" "218" "237" "265" NA "40" "75" "150"
[121] "171" "290" "335" "349" NA "23" "56" "115" "247" "253" "270" "278"
[133] NA "34" "46" "50"
na.omit(as.data.frame(LO31SVList))
#Learning outcome 23 handling exception data of midterm MD1922
#Learning outcome 23 only have 1 question in midterm (MD1922) and 2 in final
TotalQFrameGKEX
#majority of students have right answer for Lo23MD1922 midterm
DiemGK.1922.LO23
DiemGK.1922.LO23
0 1
7 84
#No student have 3 right answer for total Learning outcome 23(mid/final).
LOW23
# Cau VI.3
# IDK
#
GKMN<- DiemGKCK.2[,c(3,5:29)]
Nhom1<-GKMN[GKMN[,1] == "L01",]
Nhom2<-GKMN[GKMN[,1] == "L02",]
Nhom3<-GKMN[GKMN[,1] == "L03",]
Nhom1$TongDiem <-round(rowSums(apply(Nhom1[,c(2:26)],2,as.numeric))/25*10,1)
#average of each Nhom
mean(round(rowSums(apply(Nhom1[,c(2:26)],2,as.numeric))/25*10,1))
mean(round(rowSums(apply(Nhom2[,c(2:26)],2,as.numeric))/25*10,1))
mean(round(rowSums(apply(Nhom3[,c(2:26)],2,as.numeric))/25*10,1))
#median of each Nhom
median(round(rowSums(apply(Nhom1[,c(2:26)],2,as.numeric))/25*10,1))
median(round(rowSums(apply(Nhom2[,c(2:26)],2,as.numeric))/25*10,1))
median(round(rowSums(apply(Nhom3[,c(2:26)],2,as.numeric))/25*10,1))
#Frequency of each Nhom according to Diem
FNhom1 <-as.data.frame(table(round(rowSums(apply(Nhom1[,c(2:26)],2,as.numeric))/25*10,1)))
colnames(FNhom1) <- c("Diem", "Percentage")
FNhom1$Percentage <- round(FNhom1$Percentage/sum(FNhom1$Percentage)*100,2)
FNhom2 <-as.data.frame(table(round(rowSums(apply(Nhom2[,c(2:26)],2,as.numeric))/25*10,1)))
colnames(FNhom2) <- c("Diem", "Percentage")
FNhom2$Percentage <- round(FNhom2$Percentage/sum(FNhom2$Percentage)*100,2)
FNhom3 <-as.data.frame(table(round(rowSums(apply(Nhom3[,c(2:26)],2,as.numeric))/25*10,1)))
colnames(FNhom3) <- c("Diem", "Percentage")
FNhom3$Percentage <- round(FNhom3$Percentage/sum(FNhom3$Percentage)*100,2)
GNhom1 <- ggplot(FNhom1, aes(x = as.character(FNhom1[,1]), y = FNhom1[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=FNhom1[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Nhom 1", x = "Diem", y = "%SV cua nhom") + theme(panel.background = element_rect(fill = "#d557d5"))
GNhom2 <- ggplot(FNhom2, aes(x = as.character(FNhom2[,1]), y = FNhom2[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=FNhom2[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Nhom 2", x = "Diem", y = "%SV cua nhom") + theme(panel.background = element_rect(fill = "#d557d5"))
GNhom3 <- ggplot(FNhom3, aes(x = as.character(FNhom3[,1]), y = FNhom3[,2])) + geom_bar(stat = "identity") + geom_text(aes(label=FNhom3[,2]), vjust=-0.3, size=3.5, )+
labs(title = "Nhom 3", x = "Diem", y = "%SV cua nhom") + theme(panel.background = element_rect(fill = "#d557d5"))
GNhom <- ggarrange(GNhom1,GNhom2,GNhom3, ncol = 3)
GNhom
#conclusion:
#Nhom3 has high grade with highest average grade
#Nhom1 has low grade with lowest average grade
#Nhom2 has average grade slightly lower than Nhom3
LS0tCnRpdGxlOiAiQmFpIHRhcCBsb24gTW9uIENhdSB0cnVjIHJvaSByYWMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojIENhaSBkYXQgY2FjIHRodSB2aWVuIGNhbiB0aGlldAojIGluc3RhbGwucGFja2FnZXMoIm1vbWVudHMiKQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIpCiMgaW5zdGFsbC5wYWNrYWdlcygiaHJicnRoZW1lcyIpCmBgYAoKCmBgYHtyfQojIExvYWQgY2FjIHRodSB2aWVuIGNhbiB0aGlldApsaWJyYXJ5KG1vbWVudHMpICMgRHVuZyBkZSB0aHVjIGhpZW4gY2FjIGZ1Y250aW9uIFN0YXRpc3RpY3MKbGlicmFyeShkcGx5cikgIyBEdW5nIGRlIGxhbSB2aWVjIHZvaSBjYWMgRGF0YWZyYW1lCmxpYnJhcnkocmVhZHhsKSAjIER1bmcgZGUgZG9jIGZpbGUgRXhjZWwKbGlicmFyeSh4bHN4KQpsaWJyYXJ5KGdncGxvdDIpICMgRHVuZyBkZSB2ZSBkbyB0aGkKbGlicmFyeShncmlkRXh0cmEpICMgRHVuZyBkZSAgZGFuIGxheW91dCBjaG8gY2FjIHBsb3QKbGlicmFyeShncmlkKQpsaWJyYXJ5KGhyYnJ0aGVtZXMpICMgRHVuZyBkZSBsb2FkIHRoZW1lIGNobyBjYWMgcGxvdApsaWJyYXJ5KGdncHVicikKYGBgCgpgYGB7cn0KIyBUYW8gZGF0YWZyYW1lIEdpdWEga3kgdHUgdHJpY2ggeHVhdCBmaWxlIEV4Y2VsIC0gc2hlZXQgIkdLIgpkYXRhR0sgPC0gcmVhZF9leGNlbCgiMTkyX0NPMTAwNy54bHN4Iiwgc2hlZXQgPSAiR0siLCBza2lwID0gNCkKZGF0YUdLWyFjb21wbGV0ZS5jYXNlcyhkYXRhR0spLF0KCiMgVGFvIGRhdGFmcmFtZSBDdW9pIGt5IHR1IHRyaWNoIHh1YXQgZmlsZSBFeGNlbCAtIHNoZWV0ICJDSyIKZGF0YUNLIDwtIHJlYWRfZXhjZWwoIjE5Ml9DTzEwMDcueGxzeCIsIHNoZWV0ID0gIkNLIiwgc2tpcCA9IDQpCgojIEhpZW4gdGhpIGRhdGFmcmFtZSBHaXVhIGt5CmRhdGFHSwoKIyBIaWVuIHRoaSBkYXRhZnJhbWUgQ3VvaSBreQpkYXRhQ0sKYGBgCmBgYHtyfQojIEtldCBxdWEgY2hhbSB0aGkgR2l1YSBreQpLZXRRdWFHSyA8LSBkYXRhR0tbLCBjKCJObyIsICJNQU5IIiwgIlRPIiwgIk1BREUiLCAiMSI6IjI1IildCktldFF1YUdLCgojIEJhaSB0aGkgY3VhIFNpbmggdmllbiBHaXVhIGt5CiMgQm9pIHZpIHRyb25nIEJhaVRoaUdLIGNvIG5odW5nIGNhdSBTaW5oIHZpZW4gYm8gdHJvbmcgKHZhbHVlID0gTkEpLCBuZW4gY2h1bmcgdGEgc2Uga2hvbmcgdGhlIGdvaSBuaHUgdHJlbgpCYWlUaGlHSyA8LSBkYXRhR0tbLCBjKDEsIDIsIDMsIDI5OjU0KV0KQmFpVGhpR0sKCiMgS2V0IHF1YSBjaGFtIHRoaSBDdW9pIGt5CktldFF1YUNLIDwtIGRhdGFDS1ssIGMoIk5vIiwgIk1BTkgiLCAiVE8iLCAiTUFERSIsICIxIjoiMjkiKV0KS2V0UXVhQ0sKCiMgQmFpIHRoaSBjdWEgU2luaCB2aWVuIEN1b2kga3kKIyBUdW9uZyB0dSBuaHUgQmFpVGhpR0sKQmFpVGhpQ0sgPC0gZGF0YUNLWywgYygxLCAyLCAzLCAzMzo2MildCkJhaVRoaUNLCmBgYAoKYGBge3J9CiMgRHVuZyBkcGx5ciB0byBjb25nIFNvIGNhdSBkdW5nIHZhIFNvIGNhdSBzYWkgY3VhIHR1bmcgU2luaCB2aWVuCiMgVGFvIEJhbmcgU28gZGFwIGFuIGR1bmcgdmEgc2FpIGN1YSBzaW5oIHZpZW4gR2l1YSBreQpTb0NhdUR1bmdWYVNhaUN1YVNWR0sgPC0gS2V0UXVhR0sgJT4lIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoCiAgICBTb0NhdUR1bmcgPSBzdW0oY19hY3Jvc3MoIjEiOiIyNSIpKSwKICAgIFNvQ2F1U2FpID0gMjUgLSBzdW0oY19hY3Jvc3MoIjEiOiIyNSIpKQogICkKCiMgVGFvIEJhbmcgU28gZGFwIGFuIGR1bmcgdmEgc2FpIGN1YSBzaW5oIHZpZW4gQ3VvaSBreQpTb0NhdUR1bmdWYVNhaUN1YVNWQ0sgPC0gS2V0UXVhQ0sgJT4lIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoCiAgICBTb0NhdUR1bmcgPSBzdW0oY19hY3Jvc3MoIjEiOiIyOSIpKSwKICAgIFNvQ2F1U2FpID0gMjkgLSBzdW0oY19hY3Jvc3MoIjEiOiIyOSIpKQogICkKYGBgCgpgYGB7cn0KIyBJbiByYSBUb25nIHNvIGNhdSBEdW5nIHRyb25nIGt5IHRoaSBHaXVhIGt5IGN1YSBzaW5oIHZpZW4gdHJvbmcgdGFwIG1hdQpUb25nU29DYXVEdW5nQ3VhU1ZHSyA9IFNvQ2F1RHVuZ1ZhU2FpQ3VhU1ZHS1ssIGMoIk5vIiwgIk1BTkgiLCAiVE8iLCAiTUFERSIsICJTb0NhdUR1bmciKV0KVG9uZ1NvQ2F1RHVuZ0N1YVNWR0sKCiMgSW4gcmEgVG9uZyBzbyBjYXUgRHVuZyB0cm9uZyBreSB0aGkgQ3VvaSBreSBjdWEgc2luaCB2aWVuIHRyb25nIHRhcCBtYXUKVG9uZ1NvQ2F1RHVuZ0N1YVNWQ0sgPSBTb0NhdUR1bmdWYVNhaUN1YVNWQ0tbLCBjKCJObyIsICJNQU5IIiwgIlRPIiwgIk1BREUiLCAiU29DYXVEdW5nIildClRvbmdTb0NhdUR1bmdDdWFTVkNLCmBgYAoKYGBge3J9CiMgSW4gcmEgVG9uZyBzbyBjYXUgU2FpIHRyb25nIGt5IHRoaSBHaXVhIGt5IGN1YSBzaW5oIHZpZW4gdHJvbmcgdGFwIG1hdQpUb25nU29DYXVTYWlDdWFTVkdLID0gU29DYXVEdW5nVmFTYWlDdWFTVkdLWywgYygiTm8iLCAiTUFOSCIsICJUTyIsICJNQURFIiwgIlNvQ2F1U2FpIildClRvbmdTb0NhdVNhaUN1YVNWR0sKCiMgSW4gcmEgVG9uZyBzbyBjYXUgU2FpIHRyb25nIGt5IHRoaSBDdW9pIGt5IGN1YSBzaW5oIHZpZW4gdHJvbmcgdGFwIG1hdQpUb25nU29DYXVTYWlDdWFTVkNLID0gU29DYXVEdW5nVmFTYWlDdWFTVkNLWywgYygiTm8iLCAiTUFOSCIsICJUTyIsICJNQURFIiwgIlNvQ2F1U2FpIildClRvbmdTb0NhdVNhaUN1YVNWQ0sKYGBgCgoKYGBge3J9CiMgWGFjIGRpbmggY2F1IGR1bmcgbmhpZXUgbmhhdCB2YSBuaG8gbmhhdCB0cm9uZyB0YXAgbWF1IEdpdWEga3kKIyBUaW5oIHJhIERhbmggc2FjaCAoTGlzdCkgc28gbGFuIER1bmcgY3VhIG1vaSBjYXUgR2l1YSBreQpTb0NhdUR1bmdHSyA8LSBjb2xTdW1zKGRhdGFHS1ssYyg0OjI4KV0pCkNhdUR1bmdOaGlldU5oYXRHSyA8LSBzdWJzZXQoU29DYXVEdW5nR0ssIFNvQ2F1RHVuZ0dLID09IG1heChTb0NhdUR1bmdHSykpCkNhdUR1bmdJdE5oYXRHSyA8LSBzdWJzZXQoU29DYXVEdW5nR0ssU29DYXVEdW5nR0sgPT0gbWluKFNvQ2F1RHVuZ0dLKSkKc3ByaW50ZigiQ2F1ICVzIGxhIGNhdSBkdW9jIGNob24gZHVuZyBuaGlldSBuaGF0IEdpdWEga3kgdm9pICVzIGxhbiBjaG9uIGR1bmciLCBuYW1lcyhDYXVEdW5nTmhpZXVOaGF0R0spLCBDYXVEdW5nTmhpZXVOaGF0R0spCnNwcmludGYoIkNhdSAlcyBsYSBjYXUgZHVvYyBjaG9uIGR1bmcgaXQgbmhhdCBHaXVhIGt5IGNoaSB2b2kgJXMgbGFuIGNob24gZHVuZyIsIG5hbWVzKENhdUR1bmdJdE5oYXRHSyksIENhdUR1bmdJdE5oYXRHSykKCiMgWGFjIGRpbmggY2F1IGR1bmcgbmhpZXUgbmhhdCB2YSBuaG8gbmhhdCB0cm9uZyB0YXAgbWF1IEN1b2kga3kKIyBUaW5oIHJhIERhbmggc2FjaCAoTGlzdCkgc28gbGFuIER1bmcgY3VhIG1vaSBjYXUgQ3VvaSBreQpTb0NhdUR1bmdDSyA8LSBjb2xTdW1zKGRhdGFDS1ssYyg0OjMyKV0pCkNhdUR1bmdOaGlldU5oYXRDSyA8LSBzdWJzZXQoU29DYXVEdW5nQ0ssU29DYXVEdW5nQ0sgPT0gbWF4KFNvQ2F1RHVuZ0NLKSkKQ2F1RHVuZ0l0TmhhdENLIDwtIHN1YnNldChTb0NhdUR1bmdDSyxTb0NhdUR1bmdDSyA9PSBtaW4oU29DYXVEdW5nQ0spKQpzcHJpbnRmKCJDYXUgJXMgbGEgY2F1IGR1b2MgY2hvbiBkdW5nIG5oaWV1IG5oYXQgQ3VvaSBreSB2b2kgJXMgbGFuIGNob24gZHVuZyIsIG5hbWVzKENhdUR1bmdOaGlldU5oYXRDSyksIENhdUR1bmdOaGlldU5oYXRDSykKc3ByaW50ZigiQ2F1ICVzIGxhIGNhdSBkdW9jIGNob24gZHVuZyBpdCBuaGF0IEN1b2kga3kgY2hpIHZvaSAlcyBsYW4gY2hvbiBkdW5nIiwgbmFtZXMoQ2F1RHVuZ0l0TmhhdENLKSwgQ2F1RHVuZ0l0TmhhdENLKQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoID0gMTB9CiMgVGluaCBTbyBsYW4gY2hvbiBkdW5nIG1vaSBjYXUgdGhlbyBtYSBkZSBHaXVhIGt5CiMgVGFvIHN1YnNldCB0dSBUb25nU29DYXVEdW5nQ3VhU1ZHSyBjaGkgZ29tIHR1bmcgTUFERSAxOTIxClNvQ2F1RHVuZ0dLMTkyMSA8LSBzdWJzZXQoVG9uZ1NvQ2F1RHVuZ0N1YVNWR0ssIFRvbmdTb0NhdUR1bmdDdWFTVkdLJE1BREUgPT0gMTkyMSkKIyBUYW8gbWF0cml4IDEgeCBuIHRyb25nIGRvIG4gbGEgc28gY2F1IGNob24gZHVuZyBjdWEgc2luaCB2aWVuIHRoZSBtYSBkZSAxOTIxClNvTGFuQ2hvbkR1bmdHSzE5MjEgPC0gdGFibGUoU29DYXVEdW5nR0sxOTIxJFNvQ2F1RHVuZykKZER1bmdHSzE5MjEgPC0gZGF0YS5mcmFtZShTb0xhbkNob25EdW5nR0sxOTIxKQpjb2xuYW1lcyhkRHVuZ0dLMTkyMSkgPC0gYygiU29DYXVEdW5nIiwgIlNvU2luaFZpZW4iKQpwRHVuZ0dLMTkyMSA8LSBnZ3Bsb3QoZER1bmdHSzE5MjEsIGFlcyh4PVNvQ2F1RHVuZywgeT1Tb1NpbmhWaWVuKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9InN0ZWVsYmx1ZSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFNvU2luaFZpZW4sIHkgPSBTb1NpbmhWaWVuKSwgc2l6ZSA9IDMuNSwgdmp1c3QgPSAxLjYpCgojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1RHVuZ0N1YVNWR0sgY2hpIGdvbSB0dW5nIE1BREUgMTkyMgpTb0NhdUR1bmdHSzE5MjIgPC0gc3Vic2V0KFRvbmdTb0NhdUR1bmdDdWFTVkdLLCBUb25nU29DYXVEdW5nQ3VhU1ZHSyRNQURFID09IDE5MjIpCiMgVGFvIG1hdHJpeCAxIHggbiB0cm9uZyBkbyBuIGxhIHNvIGNhdSBjaG9uIGR1bmcgY3VhIHNpbmggdmllbiB0aGUgbWEgZGUgMTkyMgpTb0xhbkNob25EdW5nR0sxOTIyIDwtIHRhYmxlKFNvQ2F1RHVuZ0dLMTkyMiRTb0NhdUR1bmcpCmREdW5nR0sxOTIyIDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uRHVuZ0dLMTkyMikKY29sbmFtZXMoZER1bmdHSzE5MjIpIDwtIGMoIlNvQ2F1RHVuZyIsICJTb1NpbmhWaWVuIikKcER1bmdHSzE5MjIgPC0gZ2dwbG90KGREdW5nR0sxOTIyLCBhZXMoeD1Tb0NhdUR1bmcsIHk9U29TaW5oVmllbikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJkYXJrZ29sZGVucm9kMSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFNvU2luaFZpZW4sIHkgPSBTb1NpbmhWaWVuKSwgc2l6ZSA9IDMuNSwgdmp1c3QgPSAxLjYpCgojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1RHVuZ0N1YVNWR0sgY2hpIGdvbSB0dW5nIE1BREUgMTkyMwpTb0NhdUR1bmdHSzE5MjMgPC0gc3Vic2V0KFRvbmdTb0NhdUR1bmdDdWFTVkdLLCBUb25nU29DYXVEdW5nQ3VhU1ZHSyRNQURFID09IDE5MjMpCiMgVGFvIG1hdHJpeCAxIHggbiB0cm9uZyBkbyBuIGxhIHNvIGNhdSBjaG9uIGR1bmcgY3VhIHNpbmggdmllbiB0aGUgbWEgZGUgMTkyMgpTb0xhbkNob25EdW5nR0sxOTIzIDwtIHRhYmxlKFNvQ2F1RHVuZ0dLMTkyMyRTb0NhdUR1bmcpCmREdW5nR0sxOTIzIDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uRHVuZ0dLMTkyMykKY29sbmFtZXMoZER1bmdHSzE5MjMpIDwtIGMoIlNvQ2F1RHVuZyIsICJTb1NpbmhWaWVuIikKcER1bmdHSzE5MjMgPC0gZ2dwbG90KGREdW5nR0sxOTIzLCBhZXMoeD1Tb0NhdUR1bmcsIHk9U29TaW5oVmllbikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJkYXJrc2VhZ3JlZW4iKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBTb1NpbmhWaWVuLCB5ID0gU29TaW5oVmllbiksIHNpemUgPSAzLjUsIHZqdXN0ID0gMS42KQoKIyBUYW8gc3Vic2V0IHR1IFRvbmdTb0NhdUR1bmdDdWFTVkdLIGNoaSBnb20gdHVuZyBNQURFIDE5MjQKU29DYXVEdW5nR0sxOTI0IDwtIHN1YnNldChUb25nU29DYXVEdW5nQ3VhU1ZHSywgVG9uZ1NvQ2F1RHVuZ0N1YVNWR0skTUFERSA9PSAxOTI0KQojIFRhbyBtYXRyaXggMSB4IG4gdHJvbmcgZG8gbiBsYSBzbyBjYXUgY2hvbiBkdW5nIGN1YSBzaW5oIHZpZW4gdGhlIG1hIGRlIDE5MjQKU29MYW5DaG9uRHVuZ0dLMTkyNCA8LSB0YWJsZShTb0NhdUR1bmdHSzE5MjQkU29DYXVEdW5nKQpkRHVuZ0dLMTkyNCA8LSBkYXRhLmZyYW1lKFNvTGFuQ2hvbkR1bmdHSzE5MjQpCmNvbG5hbWVzKGREdW5nR0sxOTI0KSA8LSBjKCJTb0NhdUR1bmciLCAiU29TaW5oVmllbiIpCnBEdW5nR0sxOTI0IDwtIGdncGxvdChkRHVuZ0dLMTkyNCwgYWVzKHg9U29DYXVEdW5nLCB5PVNvU2luaFZpZW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iY29yYWwxIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gU29TaW5oVmllbiwgeSA9IFNvU2luaFZpZW4pLCBzaXplID0gMy41LCB2anVzdCA9IDEuNikKCiMgSGllbiB0aGkgNCBiaWV1IGRvCmcgPC0gZ3JpZC5hcnJhbmdlKAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIxLCBib3R0b20gPSAixJDhu4EgMTkyMSIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIyLCBib3R0b20gPSAixJDhu4EgMTkyMiIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIzLCBib3R0b20gPSAixJDhu4EgMTkyMyIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTI0LCBib3R0b20gPSAixJDhu4EgMTkyNCIpLAogIG5yb3cgPSAyLAogIGJvdHRvbSA9ICJU4buVbmcgc+G7kSBjw6FjIGPDonUgxJHDum5nIGPhu6dhIHNpbmggdmnDqm4gdGhlbyBNw6MgxJHhu4EgY+G7p2EgdOG6rXAgbeG6q3UgR2nhu69hIGvhu7MiCikKCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKZ2dzYXZlKCJoaW5oLzUyNDFfdG9uZ3NvY2F1ZHVuZ19nay5qcGciLCBnKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQojIFRpbmggU28gbGFuIGNob24gZHVuZyBtb2kgY2F1IHRoZW8gbWEgZGUgQ3VvaSBreQojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1RHVuZ0N1YVNWQ0sgY2hpIGdvbSB0dW5nIE1BREUgMTkyMQpTb0NhdUR1bmdDSzE5MjEgPC0gc3Vic2V0KFRvbmdTb0NhdUR1bmdDdWFTVkNLLCBUb25nU29DYXVEdW5nQ3VhU1ZDSyRNQURFID09IDE5MjEpCiMgVGFvIG1hdHJpeCAxIHggbiB0cm9uZyBkbyBuIGxhIHNvIGNhdSBjaG9uIGR1bmcgY3VhIHNpbmggdmllbiB0aGUgbWEgZGUgMTkyMQpTb0xhbkNob25EdW5nQ0sxOTIxIDwtIHRhYmxlKFNvQ2F1RHVuZ0NLMTkyMSRTb0NhdUR1bmcpCmREdW5nQ0sxOTIxIDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uRHVuZ0NLMTkyMSkKY29sbmFtZXMoZER1bmdDSzE5MjEpIDwtIGMoIlNvQ2F1RHVuZyIsICJTb1NpbmhWaWVuIikKcER1bmdDSzE5MjEgPC0gZ2dwbG90KGREdW5nQ0sxOTIxLCBhZXMoeD1Tb0NhdUR1bmcsIHk9U29TaW5oVmllbikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJjb3JhbDEiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBTb1NpbmhWaWVuLCB5ID0gU29TaW5oVmllbiksIHNpemUgPSAzLjUsIHZqdXN0ID0gMS42KQoKIyBUYW8gc3Vic2V0IHR1IFRvbmdTb0NhdUR1bmdDdWFTVkNLIGNoaSBnb20gdHVuZyBNQURFIDE5MjIKU29DYXVEdW5nQ0sxOTIyIDwtIHN1YnNldChUb25nU29DYXVEdW5nQ3VhU1ZDSywgVG9uZ1NvQ2F1RHVuZ0N1YVNWQ0skTUFERSA9PSAxOTIyKQojIFRhbyBtYXRyaXggMSB4IG4gdHJvbmcgZG8gbiBsYSBzbyBjYXUgY2hvbiBkdW5nIGN1YSBzaW5oIHZpZW4gdGhlIG1hIGRlIDE5MjIKU29MYW5DaG9uRHVuZ0NLMTkyMiA8LSB0YWJsZShTb0NhdUR1bmdDSzE5MjIkU29DYXVEdW5nKQpkRHVuZ0NLMTkyMiA8LSBkYXRhLmZyYW1lKFNvTGFuQ2hvbkR1bmdDSzE5MjIpCmNvbG5hbWVzKGREdW5nQ0sxOTIyKSA8LSBjKCJTb0NhdUR1bmciLCAiU29TaW5oVmllbiIpCnBEdW5nQ0sxOTIyIDwtIGdncGxvdChkRHVuZ0NLMTkyMiwgYWVzKHg9U29DYXVEdW5nLCB5PVNvU2luaFZpZW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iY29yYWwxIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gU29TaW5oVmllbiwgeSA9IFNvU2luaFZpZW4pLCBzaXplID0gMy41LCB2anVzdCA9IDEuNikKCiMgVGFvIHN1YnNldCB0dSBUb25nU29DYXVEdW5nQ3VhU1ZDSyBjaGkgZ29tIHR1bmcgTUFERSAxOTIzClNvQ2F1RHVuZ0NLMTkyMyA8LSBzdWJzZXQoVG9uZ1NvQ2F1RHVuZ0N1YVNWQ0ssIFRvbmdTb0NhdUR1bmdDdWFTVkNLJE1BREUgPT0gMTkyMykKIyBUYW8gbWF0cml4IDEgeCBuIHRyb25nIGRvIG4gbGEgc28gY2F1IGNob24gZHVuZyBjdWEgc2luaCB2aWVuIHRoZSBtYSBkZSAxOTIyClNvTGFuQ2hvbkR1bmdDSzE5MjMgPC0gdGFibGUoU29DYXVEdW5nQ0sxOTIzJFNvQ2F1RHVuZykKZER1bmdDSzE5MjMgPC0gZGF0YS5mcmFtZShTb0xhbkNob25EdW5nQ0sxOTIzKQpjb2xuYW1lcyhkRHVuZ0NLMTkyMykgPC0gYygiU29DYXVEdW5nIiwgIlNvU2luaFZpZW4iKQpwRHVuZ0NLMTkyMyA8LSBnZ3Bsb3QoZER1bmdDSzE5MjMsIGFlcyh4PVNvQ2F1RHVuZywgeT1Tb1NpbmhWaWVuKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImNvcmFsMSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFNvU2luaFZpZW4sIHkgPSBTb1NpbmhWaWVuKSwgc2l6ZSA9IDMuNSwgdmp1c3QgPSAxLjYpCgojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1RHVuZ0N1YVNWQ0sgY2hpIGdvbSB0dW5nIE1BREUgMTkyNApTb0NhdUR1bmdDSzE5MjQgPC0gc3Vic2V0KFRvbmdTb0NhdUR1bmdDdWFTVkNLLCBUb25nU29DYXVEdW5nQ3VhU1ZDSyRNQURFID09IDE5MjQpCiMgVGFvIG1hdHJpeCAxIHggbiB0cm9uZyBkbyBuIGxhIHNvIGNhdSBjaG9uIGR1bmcgY3VhIHNpbmggdmllbiB0aGUgbWEgZGUgMTkyNApTb0xhbkNob25EdW5nQ0sxOTI0IDwtIHRhYmxlKFNvQ2F1RHVuZ0NLMTkyNCRTb0NhdUR1bmcpCmREdW5nQ0sxOTI0IDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uRHVuZ0NLMTkyNCkKY29sbmFtZXMoZER1bmdDSzE5MjQpIDwtIGMoIlNvQ2F1RHVuZyIsICJTb1NpbmhWaWVuIikKcER1bmdDSzE5MjQgPC0gZ2dwbG90KGREdW5nQ0sxOTI0LCBhZXMoeD1Tb0NhdUR1bmcsIHk9U29TaW5oVmllbikpICsgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iY29yYWwxIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gU29TaW5oVmllbiwgeSA9IFNvU2luaFZpZW4pLCBzaXplID0gMy41LCB2anVzdCA9IDEuNikKCiMgSGllbiB0aGkgNCBiaWV1IGRvCmcgPC0gZ3JpZC5hcnJhbmdlKAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIxLCBib3R0b20gPSAixJDhu4EgMTkyMSIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIyLCBib3R0b20gPSAixJDhu4EgMTkyMiIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIzLCBib3R0b20gPSAixJDhu4EgMTkyMyIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTI0LCBib3R0b20gPSAixJDhu4EgMTkyNCIpLAogIG5yb3cgPSAyLAogIGJvdHRvbSA9ICJU4buVbmcgc+G7kSBjw6FjIGPDonUgxJHDum5nIGPhu6dhIHNpbmggdmnDqm4gdGhlbyBNw6MgxJHhu4EgY+G7p2EgdOG6rXAgbeG6q3UgQ3Xhu5FpIGvhu7MiCikKCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKZ2dzYXZlKCJoaW5oLzUyNDJfdG9uZ3NvY2F1ZHVuZ19jay5qcGciLCBnKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQojIFRpbmggU28gbGFuIGNob24gc2FpIG1vaSBjYXUgdGhlbyBtYSBkZSBHaXVhIGt5CiMgVGFvIHN1YnNldCB0dSBUb25nU29DYXVTYWlDdWFTVkdLIGNoaSBnb20gdHVuZyBNQURFIDE5MjEKU29DYXVTYWlHSzE5MjEgPC0gc3Vic2V0KFRvbmdTb0NhdVNhaUN1YVNWR0ssIFRvbmdTb0NhdVNhaUN1YVNWR0skTUFERSA9PSAxOTIxKQojIFRhbyBtYXRyaXggMSB4IG4gdHJvbmcgZG8gbiBsYSBzbyBjYXUgY2hvbiBkdW5nIGN1YSBzaW5oIHZpZW4gdGhlIG1hIGRlIDE5MjEKU29MYW5DaG9uU2FpR0sxOTIxIDwtIHRhYmxlKFNvQ2F1U2FpR0sxOTIxJFNvQ2F1U2FpKQpkU2FpR0sxOTIxIDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uU2FpR0sxOTIxKQpjb2xuYW1lcyhkU2FpR0sxOTIxKSA8LSBjKCJTb0NhdVNhaSIsICJTb1NpbmhWaWVuIikKcFNhaUdLMTkyMSA8LSBnZ3Bsb3QoZFNhaUdLMTkyMSwgYWVzKHg9U29DYXVTYWksIHk9U29TaW5oVmllbikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJjb3JhbDEiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBTb1NpbmhWaWVuLCB5ID0gU29TaW5oVmllbiksIHNpemUgPSAzLjUsIHZqdXN0ID0gMS42KQoKIyBUYW8gc3Vic2V0IHR1IFRvbmdTb0NhdVNhaUN1YVNWR0sgY2hpIGdvbSB0dW5nIE1BREUgMTkyMgpTb0NhdVNhaUdLMTkyMiA8LSBzdWJzZXQoVG9uZ1NvQ2F1U2FpQ3VhU1ZHSywgVG9uZ1NvQ2F1U2FpQ3VhU1ZHSyRNQURFID09IDE5MjIpCiMgVGFvIG1hdHJpeCAxIHggbiB0cm9uZyBkbyBuIGxhIHNvIGNhdSBjaG9uIGR1bmcgY3VhIHNpbmggdmllbiB0aGUgbWEgZGUgMTkyMgpTb0xhbkNob25TYWlHSzE5MjIgPC0gdGFibGUoU29DYXVTYWlHSzE5MjIkU29DYXVTYWkpCmRTYWlHSzE5MjIgPC0gZGF0YS5mcmFtZShTb0xhbkNob25TYWlHSzE5MjIpCmNvbG5hbWVzKGRTYWlHSzE5MjIpIDwtIGMoIlNvQ2F1U2FpIiwgIlNvU2luaFZpZW4iKQpwU2FpR0sxOTIyIDwtIGdncGxvdChkU2FpR0sxOTIyLCBhZXMoeD1Tb0NhdVNhaSwgeT1Tb1NpbmhWaWVuKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImNvcmFsMSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFNvU2luaFZpZW4sIHkgPSBTb1NpbmhWaWVuKSwgc2l6ZSA9IDMuNSwgdmp1c3QgPSAxLjYpCgojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1U2FpQ3VhU1ZHSyBjaGkgZ29tIHR1bmcgTUFERSAxOTIzClNvQ2F1U2FpR0sxOTIzIDwtIHN1YnNldChUb25nU29DYXVTYWlDdWFTVkdLLCBUb25nU29DYXVTYWlDdWFTVkdLJE1BREUgPT0gMTkyMykKIyBUYW8gbWF0cml4IDEgeCBuIHRyb25nIGRvIG4gbGEgc28gY2F1IGNob24gZHVuZyBjdWEgc2luaCB2aWVuIHRoZSBtYSBkZSAxOTIyClNvTGFuQ2hvblNhaUdLMTkyMyA8LSB0YWJsZShTb0NhdVNhaUdLMTkyMyRTb0NhdVNhaSkKZFNhaUdLMTkyMyA8LSBkYXRhLmZyYW1lKFNvTGFuQ2hvblNhaUdLMTkyMykKY29sbmFtZXMoZFNhaUdLMTkyMykgPC0gYygiU29DYXVTYWkiLCAiU29TaW5oVmllbiIpCnBTYWlHSzE5MjMgPC0gZ2dwbG90KGRTYWlHSzE5MjMsIGFlcyh4PVNvQ2F1U2FpLCB5PVNvU2luaFZpZW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iY29yYWwxIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gU29TaW5oVmllbiwgeSA9IFNvU2luaFZpZW4pLCBzaXplID0gMy41LCB2anVzdCA9IDEuNikKCiMgVGFvIHN1YnNldCB0dSBUb25nU29DYXVTYWlDdWFTVkdLIGNoaSBnb20gdHVuZyBNQURFIDE5MjQKU29DYXVTYWlHSzE5MjQgPC0gc3Vic2V0KFRvbmdTb0NhdVNhaUN1YVNWR0ssIFRvbmdTb0NhdVNhaUN1YVNWR0skTUFERSA9PSAxOTI0KQojIFRhbyBtYXRyaXggMSB4IG4gdHJvbmcgZG8gbiBsYSBzbyBjYXUgY2hvbiBkdW5nIGN1YSBzaW5oIHZpZW4gdGhlIG1hIGRlIDE5MjQKU29MYW5DaG9uU2FpR0sxOTI0IDwtIHRhYmxlKFNvQ2F1U2FpR0sxOTI0JFNvQ2F1U2FpKQpkU2FpR0sxOTI0IDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uU2FpR0sxOTI0KQpjb2xuYW1lcyhkU2FpR0sxOTI0KSA8LSBjKCJTb0NhdVNhaSIsICJTb1NpbmhWaWVuIikKcFNhaUdLMTkyNCA8LSBnZ3Bsb3QoZFNhaUdLMTkyNCwgYWVzKHg9U29DYXVTYWksIHk9U29TaW5oVmllbikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJjb3JhbDEiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBTb1NpbmhWaWVuLCB5ID0gU29TaW5oVmllbiksIHNpemUgPSAzLjUsIHZqdXN0ID0gMS42KQoKIyBIaWVuIHRoaSA0IGJpZXUgZG8KZyA8LSBncmlkLmFycmFuZ2UoCiAgYXJyYW5nZUdyb2IocER1bmdHSzE5MjEsIGJvdHRvbSA9ICLEkOG7gSAxOTIxIiksCiAgYXJyYW5nZUdyb2IocER1bmdHSzE5MjIsIGJvdHRvbSA9ICLEkOG7gSAxOTIyIiksCiAgYXJyYW5nZUdyb2IocER1bmdHSzE5MjMsIGJvdHRvbSA9ICLEkOG7gSAxOTIzIiksCiAgYXJyYW5nZUdyb2IocER1bmdHSzE5MjQsIGJvdHRvbSA9ICLEkOG7gSAxOTI0IiksCiAgbnJvdyA9IDIsCiAgYm90dG9tID0gIlThu5VuZyBz4buRIGPDoWMgY8OidSDEkcO6bmcgY+G7p2Egc2luaCB2acOqbiB0aGVvIE3DoyDEkeG7gSBj4bunYSB04bqtcCBt4bqrdSBHaeG7r2Ega+G7syIKKQoKIyBMdXUgaGluaCBhbmggdmFvIHRodSBtdWMgaGluaAojIGdnc2F2ZSgiaGluaC81MjQzX3Rvbmdzb2NhdXNhaV9nay5qcGciLCBnKQpgYGAKYGBge3IgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxMH0KIyBUaW5oIFNvIGxhbiBjaG9uIHNhaSBtb2kgY2F1IHRoZW8gbWEgZGUgQ3VvaSBreQojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1U2FpQ3VhU1ZDSyBjaGkgZ29tIHR1bmcgTUFERSAxOTIxClNvQ2F1U2FpQ0sxOTIxIDwtIHN1YnNldChUb25nU29DYXVTYWlDdWFTVkNLLCBUb25nU29DYXVTYWlDdWFTVkNLJE1BREUgPT0gMTkyMSkKIyBUYW8gbWF0cml4IDEgeCBuIHRyb25nIGRvIG4gbGEgc28gY2F1IGNob24gZHVuZyBjdWEgc2luaCB2aWVuIHRoZSBtYSBkZSAxOTIxClNvTGFuQ2hvblNhaUNLMTkyMSA8LSB0YWJsZShTb0NhdVNhaUNLMTkyMSRTb0NhdVNhaSkKZFNhaUNLMTkyMSA8LSBkYXRhLmZyYW1lKFNvTGFuQ2hvblNhaUNLMTkyMSkKY29sbmFtZXMoZFNhaUNLMTkyMSkgPC0gYygiU29DYXVTYWkiLCAiU29TaW5oVmllbiIpCnBTYWlDSzE5MjEgPC0gZ2dwbG90KGRTYWlDSzE5MjEsIGFlcyh4PVNvQ2F1U2FpLCB5PVNvU2luaFZpZW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iY29yYWwxIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gU29TaW5oVmllbiwgeSA9IFNvU2luaFZpZW4pLCBzaXplID0gMy41LCB2anVzdCA9IDEuNikKCiMgVGFvIHN1YnNldCB0dSBUb25nU29DYXVTYWlDdWFTVkNLIGNoaSBnb20gdHVuZyBNQURFIDE5MjIKU29DYXVTYWlDSzE5MjIgPC0gc3Vic2V0KFRvbmdTb0NhdVNhaUN1YVNWQ0ssIFRvbmdTb0NhdVNhaUN1YVNWQ0skTUFERSA9PSAxOTIyKQojIFRhbyBtYXRyaXggMSB4IG4gdHJvbmcgZG8gbiBsYSBzbyBjYXUgY2hvbiBkdW5nIGN1YSBzaW5oIHZpZW4gdGhlIG1hIGRlIDE5MjIKU29MYW5DaG9uU2FpQ0sxOTIyIDwtIHRhYmxlKFNvQ2F1U2FpQ0sxOTIyJFNvQ2F1U2FpKQpkU2FpQ0sxOTIyIDwtIGRhdGEuZnJhbWUoU29MYW5DaG9uU2FpQ0sxOTIyKQpjb2xuYW1lcyhkU2FpQ0sxOTIyKSA8LSBjKCJTb0NhdVNhaSIsICJTb1NpbmhWaWVuIikKcFNhaUNLMTkyMiA8LSBnZ3Bsb3QoZFNhaUNLMTkyMiwgYWVzKHg9U29DYXVTYWksIHk9U29TaW5oVmllbikpICsgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBmaWxsPSJjb3JhbDEiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBTb1NpbmhWaWVuLCB5ID0gU29TaW5oVmllbiksIHNpemUgPSAzLjUsIHZqdXN0ID0gMS42KQoKIyBUYW8gc3Vic2V0IHR1IFRvbmdTb0NhdVNhaUN1YVNWQ0sgY2hpIGdvbSB0dW5nIE1BREUgMTkyMwpTb0NhdVNhaUNLMTkyMyA8LSBzdWJzZXQoVG9uZ1NvQ2F1U2FpQ3VhU1ZDSywgVG9uZ1NvQ2F1U2FpQ3VhU1ZDSyRNQURFID09IDE5MjMpCiMgVGFvIG1hdHJpeCAxIHggbiB0cm9uZyBkbyBuIGxhIHNvIGNhdSBjaG9uIGR1bmcgY3VhIHNpbmggdmllbiB0aGUgbWEgZGUgMTkyMgpTb0xhbkNob25TYWlDSzE5MjMgPC0gdGFibGUoU29DYXVTYWlDSzE5MjMkU29DYXVTYWkpCmRTYWlDSzE5MjMgPC0gZGF0YS5mcmFtZShTb0xhbkNob25TYWlDSzE5MjMpCmNvbG5hbWVzKGRTYWlDSzE5MjMpIDwtIGMoIlNvQ2F1U2FpIiwgIlNvU2luaFZpZW4iKQpwU2FpQ0sxOTIzIDwtIGdncGxvdChkU2FpQ0sxOTIzLCBhZXMoeD1Tb0NhdVNhaSwgeT1Tb1NpbmhWaWVuKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImNvcmFsMSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFNvU2luaFZpZW4sIHkgPSBTb1NpbmhWaWVuKSwgc2l6ZSA9IDMuNSwgdmp1c3QgPSAxLjYpCgojIFRhbyBzdWJzZXQgdHUgVG9uZ1NvQ2F1U2FpQ3VhU1ZDSyBjaGkgZ29tIHR1bmcgTUFERSAxOTI0ClNvQ2F1U2FpQ0sxOTI0IDwtIHN1YnNldChUb25nU29DYXVTYWlDdWFTVkNLLCBUb25nU29DYXVTYWlDdWFTVkNLJE1BREUgPT0gMTkyNCkKIyBUYW8gbWF0cml4IDEgeCBuIHRyb25nIGRvIG4gbGEgc28gY2F1IGNob24gZHVuZyBjdWEgc2luaCB2aWVuIHRoZSBtYSBkZSAxOTI0ClNvTGFuQ2hvblNhaUNLMTkyNCA8LSB0YWJsZShTb0NhdVNhaUNLMTkyNCRTb0NhdVNhaSkKZFNhaUNLMTkyNCA8LSBkYXRhLmZyYW1lKFNvTGFuQ2hvblNhaUNLMTkyNCkKY29sbmFtZXMoZFNhaUNLMTkyNCkgPC0gYygiU29DYXVTYWkiLCAiU29TaW5oVmllbiIpCnBTYWlDSzE5MjQgPC0gZ2dwbG90KGRTYWlDSzE5MjQsIGFlcyh4PVNvQ2F1U2FpLCB5PVNvU2luaFZpZW4pKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iY29yYWwxIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gU29TaW5oVmllbiwgeSA9IFNvU2luaFZpZW4pLCBzaXplID0gMy41LCB2anVzdCA9IDEuNikKCiMgSGllbiB0aGkgNCBiaWV1IGRvCmcgPC0gZ3JpZC5hcnJhbmdlKAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIxLCBib3R0b20gPSAixJDhu4EgMTkyMSIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIyLCBib3R0b20gPSAixJDhu4EgMTkyMiIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTIzLCBib3R0b20gPSAixJDhu4EgMTkyMyIpLAogIGFycmFuZ2VHcm9iKHBEdW5nR0sxOTI0LCBib3R0b20gPSAixJDhu4EgMTkyNCIpLAogIG5yb3cgPSAyLAogIGJvdHRvbSA9ICJU4buVbmcgc+G7kSBjw6FjIGPDonUgxJHDum5nIGPhu6dhIHNpbmggdmnDqm4gdGhlbyBNw6MgxJHhu4EgY+G7p2EgdOG6rXAgbeG6q3UgQ3Xhu5FpIGvhu7MiCikKCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKZ2dzYXZlKCJoaW5oLzUyNDRfdG9uZ3NvY2F1c2FpX2NrLmpwZyIsIGcpCmBgYApQaGFuIElJSQpgYGB7cn0KIyBUaW5oIGRpZW0gY3VhIG1vaSBzaW5oIHZpZW4gdHJvbmcga3kgdGhpIEdpdWEga3kgdmEgQ3VvaSBreQpkYXRhR0skVG9uZ0RpZW1HSyA9IChyb3VuZChyb3dTdW1zKGRhdGFHS1ssYyg0OjI4KV0pLzI1KjEwLDEpKQpkYXRhQ0skVG9uZ0RpZW1DSyA9IChyb3VuZChyb3dTdW1zKGRhdGFDS1ssYyg0OjMyKV0pLzI5KjEwLDEpKQoKIyBUYW8gcmEgMSB0YWJsZSBtb2kgY2hpIGdvbSAyIGNvdCBObyAmIFRvbmdEaWVtR0svVG9uZ0RpZW1DSwpEaWVtQ3VhTW9pU1ZHSzwtIHNlbGVjdChkYXRhR0ssTm8sVG9uZ0RpZW1HSykKRGllbUN1YU1vaVNWQ0s8LSBzZWxlY3QoZGF0YUNLLE5vLFRvbmdEaWVtQ0spCgojIFRoZW1lIGNobyB0YWJsZQp0aG0gPC0gdHRoZW1lX21pbmltYWwoCiAgY29yZT1saXN0KGJnX3BhcmFtcyA9IGxpc3QoZmlsbCA9IGJsdWVzOVsxOjRdLCBjb2w9TkEpLAogICAgICAgICAgICBmZ19wYXJhbXM9bGlzdChmb250ZmFjZT0zKSksCiAgY29saGVhZD1saXN0KGZnX3BhcmFtcz1saXN0KGNvbD0ibmF2eWJsdWUiLCBmb250ZmFjZT00TCkpLAogIHJvd2hlYWQ9bGlzdChmZ19wYXJhbXM9bGlzdChjb2w9Im9yYW5nZSIsIGZvbnRmYWNlPTNMKSkpCgojIERhbiAyIHRhYmxlIGRpZW0gR2l1YSBreSB2YSBDdW9pIGt5CmcgPC0gZ3JpZC5hcnJhbmdlKAogIHRhYmxlR3JvYihoZWFkKERpZW1DdWFNb2lTVkdLLCAxMCksIHRoZW1lID0gdGhtKSwKICB0YWJsZUdyb2IoaGVhZChEaWVtQ3VhTW9pU1ZDSywgMTApLCB0aGVtZSA9IHRobSksCiAgbmNvbD0yCikKIyBMdXUgaGluaCBhbmggdmFvIHRodSBtdWMgaGluaAojIGdnc2F2ZSgiaGluaC81MzExX2RpZW0uanBnIiwgZykKYGBgCmBgYHtyfQojIFRhbyAxIGJhbmcgbW9pIGJhbmcgY2FjaCBqb2luIDIgYmFuZyBEaWVtQ3VhTW9pU1ZDSyAmIERpZW1DdWFNb2lTVkdLCkRpZW1Ub25nS2V0PC1mdWxsX2pvaW4oRGllbUN1YU1vaVNWQ0ssRGllbUN1YU1vaVNWR0spCkRpZW1Ub25nS2V0JFRvbmdLZXQgPSByb3VuZCgoKHJvd1N1bXMoRGllbVRvbmdLZXRbLGMoMjoyKV0pKjAuNiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3VtcyhEaWVtVG9uZ0tldFssYygzOjMpXSkqMC40KSksMSkKRGllbVRvbmdLZXQKCiMgVGhlbWUgY2hvIHRhYmxlCnRobSA8LSB0dGhlbWVfbWluaW1hbCgKICBjb3JlPWxpc3QoYmdfcGFyYW1zID0gbGlzdChmaWxsID0gYmx1ZXM5WzE6NF0sIGNvbD1OQSksCiAgICAgICAgICAgIGZnX3BhcmFtcz1saXN0KGZvbnRmYWNlPTMpKSwKICBjb2xoZWFkPWxpc3QoZmdfcGFyYW1zPWxpc3QoY29sPSJuYXZ5Ymx1ZSIsIGZvbnRmYWNlPTRMKSksCiAgcm93aGVhZD1saXN0KGZnX3BhcmFtcz1saXN0KGNvbD0ib3JhbmdlIiwgZm9udGZhY2U9M0wpKSkKCiMgRGFuIDIgdGFibGUgZGllbSBHaXVhIGt5IHZhIEN1b2kga3kKZyA8LSBncmlkLmFycmFuZ2UoCiAgdGFibGVHcm9iKGhlYWQoRGllbVRvbmdLZXQsIDEwKSwgdGhlbWUgPSB0aG0pLAogIG5jb2w9MQopCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKIyBnZ3NhdmUoImhpbmgvNTMyMV9kaWVtLmpwZyIsIGcpCmBgYAoKYGBge3J9CiMgVGluaCBUcnVuZyB2aSBtYXUsIEN1YyBkYWkgbWF1LCBDdWMgdGlldSBtYXUgY3VhIGt5IHRoaSBHaXVhIGt5ClRydW5nVmlNYXVHSyA8LSByb3VuZChtZWRpYW4oZGF0YUdLJFRvbmdEaWVtR0spLCAyKQpDdWNEYWlNYXVHSyA8LSByb3VuZChtYXgoZGF0YUdLJFRvbmdEaWVtR0spLCAyKQpDdWNUaWV1TWF1R0sgPC0gcm91bmQobWluKGRhdGFHSyRUb25nRGllbUdLKSwgMikKCiMgVGluaCBUcnVuZyB2aSBtYXUsIEN1YyBkYWkgbWF1LCBDdWMgdGlldSBtYXUgY3VhIGt5IHRoaSBHaXVhIGt5ClRydW5nVmlNYXVDSyA8LSByb3VuZChtZWRpYW4oZGF0YUNLJFRvbmdEaWVtQ0spLCAyKQpDdWNEYWlNYXVDSyA8LSByb3VuZChtYXgoZGF0YUNLJFRvbmdEaWVtQ0spLCAyKQpDdWNUaWV1TWF1Q0sgPC0gcm91bmQobWluKGRhdGFDSyRUb25nRGllbUNLKSwgMikKCiMgVGFvIDEgZGF0YWZyYW1lIGRlIHBsb3QgdGFibGUKZGYgPC0gZGF0YS5mcmFtZSgKICByb3cubmFtZXMgPSBjKCJHaXVhIGt5IiwgIkN1b2kga3kiKSwKICBUcnVuZ1ZpTWF1ID0gYyhUcnVuZ1ZpTWF1R0ssIFRydW5nVmlNYXVDSyksCiAgQ3VjRGFpTWF1ID0gYyhDdWNEYWlNYXVHSywgQ3VjRGFpTWF1Q0spLAogIEN1Y1RpZXVNYXUgPSBjKEN1Y1RpZXVNYXVHSywgQ3VjVGlldU1hdUNLKQopCgojIFRoZW1lIGNobyB0YWJsZQp0aG0gPC0gdHRoZW1lX21pbmltYWwoCiAgY29yZT1saXN0KGJnX3BhcmFtcyA9IGxpc3QoZmlsbCA9IGJsdWVzOVsxOjRdLCBjb2w9TkEpLAogICAgICAgICAgICBmZ19wYXJhbXM9bGlzdChmb250ZmFjZT0zKSksCiAgY29saGVhZD1saXN0KGZnX3BhcmFtcz1saXN0KGNvbD0ibmF2eWJsdWUiLCBmb250ZmFjZT00TCkpLAogIHJvd2hlYWQ9bGlzdChmZ19wYXJhbXM9bGlzdChjb2w9Im9yYW5nZSIsIGZvbnRmYWNlPTNMKSkpCgojIERhbiAyIHRhYmxlIGRpZW0gR2l1YSBreSB2YSBDdW9pIGt5CmcgPC0gZ3JpZC5hcnJhbmdlKAogIHRhYmxlR3JvYihkZiwgdGhlbWUgPSB0aG0pLAogIG5jb2w9MQopCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKZ2dzYXZlKCJoaW5oLzUzMTFfbWVkaWFubWF4bWluLmpwZyIsIGcpCmBgYAoKYGBge3J9CiMgRHVuZyBzdWJzZXQgZGUgbG9haSBjYWMgZ2lhIHRyaSBjbyBOL0EKU2luaFZpZW5Db0RpZW1HS0xvbkhvbkJhbmc5IDwtIG5yb3coc3Vic2V0KERpZW1Ub25nS2V0LCBUb25nRGllbUdLID49IDkpKQpTaW5oVmllbkNvRGllbUNLTG9uSG9uQmFuZzkgPC0gbnJvdyhzdWJzZXQoRGllbVRvbmdLZXQsIFRvbmdEaWVtQ0sgPj0gOSkpCnNwcmludGYoIlNvIHNpbmggdmllbiBjbyBkaWVtIEdpdWEga3kgbG9uIGhvbiBob2FjIGJhbmcgOSBsYSAlcyIsIFNpbmhWaWVuQ29EaWVtR0tMb25Ib25CYW5nOSkKc3ByaW50ZigiU28gc2luaCB2aWVuIGNvIGRpZW0gQ3VvaSBreSBsb24gaG9uIGhvYWMgYmFuZyA5IGxhICVzIiwgU2luaFZpZW5Db0RpZW1DS0xvbkhvbkJhbmc5KQpgYGAKCmBgYHtyfQpTaW5oVmllbkNvRGllbUdLTG9uSG9uQmFuZzcgPC0gbnJvdyhzdWJzZXQoRGllbVRvbmdLZXQsIFRvbmdEaWVtR0sgPj0gNykpClNpbmhWaWVuQ29EaWVtQ0tMb25Ib25CYW5nNyA8LSBucm93KHN1YnNldChEaWVtVG9uZ0tldCwgVG9uZ0RpZW1DSyA+PSA3KSkKc3ByaW50ZigiU28gc2luaCB2aWVuIGNvIGRpZW0gR2l1YSBreSBsb24gaG9uIGhvYWMgYmFuZyA3IGxhICVzIiwgU2luaFZpZW5Db0RpZW1HS0xvbkhvbkJhbmc3KQpzcHJpbnRmKCJTbyBzaW5oIHZpZW4gY28gZGllbSBDdW9pIGt5IGxvbiBob24gaG9hYyBiYW5nIDcgbGEgJXMiLCBTaW5oVmllbkNvRGllbUNLTG9uSG9uQmFuZzcpCmBgYAoKYGBge3J9ClNpbmhWaWVuQ29EaWVtR0tMb25Ib25CYW5nNSA8LSBucm93KHN1YnNldChEaWVtVG9uZ0tldCwgVG9uZ0RpZW1HSyA+PSA1KSkKU2luaFZpZW5Db0RpZW1DS0xvbkhvbkJhbmc1IDwtIG5yb3coc3Vic2V0KERpZW1Ub25nS2V0LCBUb25nRGllbUNLID49IDUpKQpzcHJpbnRmKCJTbyBzaW5oIHZpZW4gY28gZGllbSBHaXVhIGt5IGxvbiBob24gaG9hYyBiYW5nIDUgbGEgJXMiLCBTaW5oVmllbkNvRGllbUdLTG9uSG9uQmFuZzUpCnNwcmludGYoIlNvIHNpbmggdmllbiBjbyBkaWVtIEN1b2kga3kgbG9uIGhvbiBob2FjIGJhbmcgNSBsYSAlcyIsIFNpbmhWaWVuQ29EaWVtQ0tMb25Ib25CYW5nNSkKYGBgCgpgYGB7cn0KU2luaFZpZW5Db0RpZW1HS05ob0hvbjUgPC1ucm93KHN1YnNldChEaWVtVG9uZ0tldCwgVG9uZ0RpZW1HSyA8IDUpKQpTaW5oVmllbkNvRGllbUNLTmhvSG9uNSA8LSBucm93KHN1YnNldChEaWVtVG9uZ0tldCwgVG9uZ0RpZW1DSyA8IDUpKQpzcHJpbnRmKCJTbyBzaW5oIHZpZW4gY28gZGllbSBHaXVhIGt5IG5obyBob24gNSBsYSAlcyIsIFNpbmhWaWVuQ29EaWVtR0tOaG9Ib241KQpzcHJpbnRmKCJTbyBzaW5oIHZpZW4gY28gZGllbSBDdW9pIGt5IG5obyBob24gNSBsYSAlcyIsIFNpbmhWaWVuQ29EaWVtQ0tOaG9Ib241KQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQojIFBsb3QgZGllbSBHaXVhIGt5CiMgVGFvIDEgIHRhYmxlIG1vaSBkdWEgdHJlbiBjb2wgVG9uZ0RpZW1HSyBkZSBkZW0gc28gb2NjdXJyZW5jZSBjdWEgbW9pIGRpZW0gR2l1YSBreQpkZkRlbURpZW1HSyA8LSBkYXRhLmZyYW1lKHRhYmxlKGRhdGFHSyRUb25nRGllbUdLKSkKY29sbmFtZXMoZGZEZW1EaWVtR0spIDwtIGMoIkRpZW1HSyIsICJTb1NWIikKcGxvdERpZW1HSyA8LSBnZ3Bsb3QoZGZEZW1EaWVtR0ssIGFlcyh4PURpZW1HSywgeT1Tb1NWKSkgKwogIGdlb21fbGluZShjb2xvcj0iZ3JleSIsIGFlcyhncm91cD0xKSkgKwogIGdlb21fcG9pbnQoc2hhcGU9MjEsIGNvbG9yPSJibGFjayIsIGZpbGw9InN0ZWVsYmx1ZSIsIHNpemU9NikgKyB0aGVtZV9pcHN1bSgpICsKICB4bGFiKCJEaWVtIikgKyB5bGFiKCJTbyBTaW5oIHZpZW4iKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0iY29ybnNpbGsiLCBjb2xvdXI9TkEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1Tb1NWLCBoanVzdD0tMS41LCB2anVzdD0wKSkKCiMgUGxvdCBkaWVtIEN1b2kga3kKIyBUYW8gMSAgdGFibGUgbW9pIGR1YSB0cmVuIGNvbCBUb25nRGllbUNLIGRlIGRlbSBzbyBvY2N1cnJlbmNlIGN1YSBtb2kgZGllbSBDdW9pIGt5CmRmRGVtRGllbUNLIDwtIGRhdGEuZnJhbWUodGFibGUoZGF0YUNLJFRvbmdEaWVtQ0spKQpjb2xuYW1lcyhkZkRlbURpZW1DSykgPC0gYygiRGllbUNLIiwgIlNvU1YiKQpwbG90RGllbUNLIDwtIGdncGxvdChkZkRlbURpZW1DSywgYWVzKHg9RGllbUNLLCB5PVNvU1YpKSArCiAgZ2VvbV9saW5lKGNvbG9yPSJncmV5IiwgYWVzKGdyb3VwPTEpKSArCiAgZ2VvbV9wb2ludChzaGFwZT0yMSwgY29sb3I9ImJsYWNrIiwgZmlsbD0iY29yYWwxIiwgc2l6ZT02KSArIHRoZW1lX2lwc3VtKCkgKwogIHhsYWIoIkRpZW0iKSArIHlsYWIoIlNvIFNpbmggdmllbiIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChmaWxsPSJjb3Juc2lsayIsIGNvbG91cj1OQSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPVNvU1YsIGhqdXN0PS0xLjUsIHZqdXN0PTApKQoKIyBIaWVuIHRoaSAyIGJpZXUgZG8KZyA8LSBncmlkLmFycmFuZ2UoCiAgYXJyYW5nZUdyb2IocGxvdERpZW1HSywgYm90dG9tID0gIkRpZW0gR2l1YSBreSIpLAogIGFycmFuZ2VHcm9iKHBsb3REaWVtQ0ssIGJvdHRvbSA9ICJEaWVtIEN1b2kga3kiKSwKICBucm93ID0gMiwgbmNvbCA9IDEKKQojIEx1dSBoaW5oIGFuaCB2YW8gdGh1IG11YyBoaW5oCiMgZ2dzYXZlKCJoaW5oLzUzNjFfcGxvdHBob2RpZW1zaW5odmllbi5qcGciLCBnKQoKYGBgCmBgYHtyfQojIFRhbyAxIHRhYmxlIG1vaSB0dSBkYXRhR0sgdm9pIHRhdCBjYSBjYWMgY29sdW1uIHZhIHZvaSBjYWMgcm93IGNvIFRvbmdEaWVtR0sgbGEgY2FvIG5oYXQKU1ZEaWVtQ2FvTmhhdEdLPC0gc2VsZWN0KGRhdGFHS1tkYXRhR0tbLCJUb25nRGllbUdLIl0gPT0gbWF4KGRhdGFHSyRUb25nRGllbUdLKSxdLCBObywgTUFOSCwgVE8sVG9uZ0RpZW1HSykKCiMgVGFvIDEgdGFibGUgbW9pIHR1IGRhdGFDSyB2b2kgdGF0IGNhIGNhYyBjb2x1bW4gdmEgdm9pIGNhYyByb3cgY28gVG9uZ0RpZW1DSyBsYSBjYW8gbmhhdApTVkRpZW1DYW9OaGF0Q0s8LSBzZWxlY3QoZGF0YUNLW2RhdGFDS1ssIlRvbmdEaWVtQ0siXSA9PSBtYXgoZGF0YUNLJFRvbmdEaWVtQ0spLF0sIE5vLCBNQU5ILCBUTyxUb25nRGllbUNLKQoKIyBUaGVtZSBjaG8gdGFibGUKdGhtIDwtIHR0aGVtZV9taW5pbWFsKAogIGNvcmU9bGlzdChiZ19wYXJhbXMgPSBsaXN0KGZpbGwgPSBibHVlczlbMTo0XSwgY29sPU5BKSwKICAgICAgICAgICAgZmdfcGFyYW1zPWxpc3QoZm9udGZhY2U9MykpLAogIGNvbGhlYWQ9bGlzdChmZ19wYXJhbXM9bGlzdChjb2w9Im5hdnlibHVlIiwgZm9udGZhY2U9NEwpKSwKICByb3doZWFkPWxpc3QoZmdfcGFyYW1zPWxpc3QoY29sPSJvcmFuZ2UiLCBmb250ZmFjZT0zTCkpKQoKIyBEYW4gMiB0YWJsZSBkaWVtIEdpdWEga3kgdmEgQ3VvaSBreQpnIDwtIGdyaWQuYXJyYW5nZSgKICB0YWJsZUdyb2IoaGVhZChTVkRpZW1DYW9OaGF0R0ssIDEwLCksIHRoZW1lID0gdGhtKSwKICB0YWJsZUdyb2IoaGVhZChTVkRpZW1DYW9OaGF0Q0ssIDEwKSwgdGhlbWUgPSB0aG0pLAogIG5jb2w9MiwgbnJvdz0xCikKIyBMdXUgaGluaCBhbmggdmFvIHRodSBtdWMgaGluaAojIGdnc2F2ZSgiaGluaC81MzcxX2RpZW1jYW9uaGF0LmpwZyIsIGcpCmBgYAoKYGBge3J9CiMgVGFvIDEgdGFibGUgbW9pIHR1IGRhdGFHSyB2b2kgdGF0IGNhIGNhYyBjb2x1bW4gdmEgdm9pIGNhYyByb3cgY28gVG9uZ0RpZW1HSyBsYSBuaG8gbmhhdApTVkRpZW1OaG9OaGF0R0s8LSBzZWxlY3QoZGF0YUdLW2RhdGFHS1ssIlRvbmdEaWVtR0siXSA9PSBtaW4oZGF0YUdLJFRvbmdEaWVtR0spLF0sIE5vLCBNQU5ILCBUTyxUb25nRGllbUdLKQoKIyBUYW8gMSB0YWJsZSBtb2kgdHUgZGF0YUdLIHZvaSB0YXQgY2EgY2FjIGNvbHVtbiB2YSB2b2kgY2FjIHJvdyBjbyBUb25nRGllbUdLIGxhIG5obyBuaGF0ClNWRGllbU5ob05oYXRDSzwtIHNlbGVjdChkYXRhQ0tbZGF0YUNLWywiVG9uZ0RpZW1DSyJdID09IG1pbihkYXRhQ0skVG9uZ0RpZW1DSyksXSwgTm8sIE1BTkgsIFRPLFRvbmdEaWVtQ0spCgojIFRoZW1lIGNobyB0YWJsZQp0aG0gPC0gdHRoZW1lX21pbmltYWwoCiAgY29yZT1saXN0KGJnX3BhcmFtcyA9IGxpc3QoZmlsbCA9IGJsdWVzOVsxOjRdLCBjb2w9TkEpLAogICAgICAgICAgICBmZ19wYXJhbXM9bGlzdChmb250ZmFjZT0zKSksCiAgY29saGVhZD1saXN0KGZnX3BhcmFtcz1saXN0KGNvbD0ibmF2eWJsdWUiLCBmb250ZmFjZT00TCkpLAogIHJvd2hlYWQ9bGlzdChmZ19wYXJhbXM9bGlzdChjb2w9Im9yYW5nZSIsIGZvbnRmYWNlPTNMKSkpCgojIERhbiAyIHRhYmxlIGRpZW0gR2l1YSBreSB2YSBDdW9pIGt5CmcgPC0gZ3JpZC5hcnJhbmdlKAogIHRhYmxlR3JvYihoZWFkKFNWRGllbU5ob05oYXRHSywgMTAsKSwgdGhlbWUgPSB0aG0pLAogIHRhYmxlR3JvYihoZWFkKFNWRGllbU5ob05oYXRDSywgMTApLCB0aGVtZSA9IHRobSksCiAgbmNvbD0yLCBucm93PTEKKQojIEx1dSBoaW5oIGFuaCB2YW8gdGh1IG11YyBoaW5oCiMgZ2dzYXZlKCJoaW5oLzUzODFfZGllbXRoYXBuaGF0LmpwZyIsIGcpCmBgYAoKYGBge3J9CkRpZW1UcnVuZ0JpbmhHSyA8LSByb3VuZChtZWFuKERpZW1DdWFNb2lTVkdLJFRvbmdEaWVtR0spLDEpCkRpZW1UcnVuZ0JpbmhDSyA8LSByb3VuZChtZWFuKERpZW1DdWFNb2lTVkNLJFRvbmdEaWVtQ0spLDEpCnNwcmludGYoIkRpZW0gdHJ1bmcgYmluaCBjdWEgY2FjIHNpbmggdmllbiB0cm9uZyB0YXAgbWF1IEdpdWEga3kgbGEgJXMiLCBEaWVtVHJ1bmdCaW5oR0spCnNwcmludGYoIkRpZW0gdHJ1bmcgYmluaCBjdWEgY2FjIHNpbmggdmllbiB0cm9uZyB0YXAgbWF1IEN1b2kga3kgbGEgJXMiLCBEaWVtVHJ1bmdCaW5oQ0spCmBgYAoKYGBge3J9ClNWQ29EaWVtVHJ1bmdCaW5oR0sgPC1ucm93KHNlbGVjdChkYXRhR0tbZGF0YUdLWywiVG9uZ0RpZW1HSyJdID09IERpZW1UcnVuZ0JpbmhHSyxdLCBObywgTUFOSCwgVE8sVG9uZ0RpZW1HSykpClNWQ29EaWVtVHJ1bmdCaW5oQ0sgPC1ucm93KHNlbGVjdChkYXRhQ0tbZGF0YUNLWywiVG9uZ0RpZW1DSyJdID09IERpZW1UcnVuZ0JpbmhDSyxdLCBObywgTUFOSCwgVE8sVG9uZ0RpZW1DSykpCnNwcmludGYoIlNvIHNpbmggdmllbiBjbyBkaWVtIHRydW5nIGJpbmggJXMgdHJvbmcgdGFwIG1hdSBHaXVhIGt5IGxhICVzIiwgRGllbVRydW5nQmluaEdLLCBTVkNvRGllbVRydW5nQmluaEdLKQpzcHJpbnRmKCJTbyBzaW5oIHZpZW4gY28gZGllbSB0cnVuZyBiaW5oICVzIHRyb25nIHRhcCBtYXUgQ3VvaSBreSBsYSAlcyIsIERpZW1UcnVuZ0JpbmhDSywgU1ZDb0RpZW1UcnVuZ0JpbmhDSykKYGBgCgpgYGB7cn0KIyBYYWMgZGluaCBkbyBwaGFuIHRhbiBjdWEgZGllbSBzbyBjaGluaCBsYSBTdGFuZGFyZCBEZXZpYXRpb24KRG9QaGFuVGFuR0sgPC0gc2QoRGllbUN1YU1vaVNWR0skVG9uZ0RpZW1HSykKRG9QaGFuVGFuQ0sgPC0gc2QoRGllbUN1YU1vaVNWQ0skVG9uZ0RpZW1DSykKCiMgVGFvIGRhdGFmcmFtZSBkZSBjaHVhbiBiaSBwbG90IGJpZXUgZG8KZGZQaGFuVGFuIDwtIGRhdGEuZnJhbWUoCiAgS3lUaGkgPSBjKCJHaXVhIGt5IiwgIkN1b2kga3kiKSwKICBEaWVtVHJ1bmdCaW5oID0gYyhEaWVtVHJ1bmdCaW5oR0ssIERpZW1UcnVuZ0JpbmhDSyksCiAgRG9QaGFuVGFuID0gYyhEb1BoYW5UYW5HSywgRG9QaGFuVGFuQ0spCikKZyA8LSBnZ3Bsb3QoZGZQaGFuVGFuLCBhZXMoeD1LeVRoaSwgeT1EaWVtVHJ1bmdCaW5oKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49cm91bmQoRGllbVRydW5nQmluaCAtIERvUGhhblRhbiwgMiksIHltYXg9cm91bmQoRGllbVRydW5nQmluaCArIERvUGhhblRhbiwgMikpLCB3aWR0aD0wLjIsIGNvbG9yPSJjb3JhbDEiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKERpZW1UcnVuZ0JpbmggLSBEb1BoYW5UYW4sIDIpLCB5ID0gcm91bmQoRGllbVRydW5nQmluaCAtIERvUGhhblRhbiwgMikpLCB2anVzdCA9IDEuNSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChEaWVtVHJ1bmdCaW5oICsgRG9QaGFuVGFuLCAyKSwgeSA9IHJvdW5kKERpZW1UcnVuZ0JpbmggKyBEb1BoYW5UYW4sIDIpKSwgdmp1c3QgPSAtLjUpICsKICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSJzdGVlbGJsdWUiLCBzaXplPTYpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKERvUGhhblRhbiwgMikpLGhqdXN0PTEuNSwgdmp1c3Q9MCwgY29sb3I9ImNvcmFsMSIpICsKICBsYWJzKHk9Ik11YyBkbyBwaGFuIHRhbiBjdWEgZGllbSBzbyIsIHg9Ikt5IHRoaSIpCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKIyBnZ3NhdmUoImhpbmgvNTMxMTFfbXVjZG9waGFudGFuLmpwZyIsIGcpCmBgYAoKCmBgYHtyfQojIENhdSBJSUkuMTIKIyBUaW5oIGRvIG1lbyBsZWNoIGN1YSBkdSBsaWV1IGJhbmcgaGFtIHNrZXduZXNzCnNrZXduZXNzR0sgPC0gc2tld25lc3MoRGllbUN1YU1vaVNWR0skVG9uZ0RpZW1HSykKc2tld25lc3NDSyA8LSBza2V3bmVzcyhEaWVtQ3VhTW9pU1ZDSyRUb25nRGllbUNLKQpzcHJpbnRmKCJEbyBtZW8gbGVjaCAoc2tld25lc3MpIGN1YSBkdSBsaWV1IHRyb25nIG1hdSBHaXVhIGt5IGxhICVzIiwgc2tld25lc3NHSykKc3ByaW50ZigiRG8gbWVvIGxlY2ggKHNrZXduZXNzKSBjdWEgZHUgbGlldSB0cm9uZyBtYXUgQ3VvaSBreSBsYSAlcyIsIHNrZXduZXNzQ0spCgojIFRpbmggZG8gbmhvbiBjdWEgZHUgbGlldSBiYW5nIGhhbSBrdXJ0b3NpcwprdXJ0b3Npc0dLIDwtIGt1cnRvc2lzKERpZW1DdWFNb2lTVkdLJFRvbmdEaWVtR0spCmt1cnRvc2lzQ0sgPC0ga3VydG9zaXMoRGllbUN1YU1vaVNWQ0skVG9uZ0RpZW1DSykKc3ByaW50ZigiRG8gbmhvbiAoa3VydG9zaXMpIGN1YSBkdSBsaWV1IHRyb25nIG1hdSBHaXVhIGt5IGxhICVzIiwga3VydG9zaXNHSykKc3ByaW50ZigiRG8gbmhvbiAoa3VydG9zaXMpIGN1YSBkdSBsaWV1IHRyb25nIG1hdSBDdW9pIGt5IGxhICVzIiwga3VydG9zaXNDSykKYGBgCgpgYGB7cn0KIyBDYXUgSUlJLjEzCiMgR2lhdCB0aGljaCBRMSB2YSBRMwojIDAlIC0+IDI1JSAtPiA1MCUgLT4gNzUlIC0+IDEwMCUKIyBtaW4gLT4gUTEgLT4gbWVhbiAtPiBRMyAtPiBtYXgKIyBUaW5oIFExICYgUTMgY2hvIHRhcCBtYXUgR2l1YSBreQpRMUdLID0gcXVhbnRpbGUoRGllbUN1YU1vaVNWR0skVG9uZ0RpZW1HSywwLjI1KQpRM0dLID0gcXVhbnRpbGUoRGllbUN1YU1vaVNWR0skVG9uZ0RpZW1HSywwLjc1KQpzcHJpbnRmKCJUdSBwaGFuIHZpIChxdWFydGlsZSkgdGh1IG5oYXQgKFExKSB2YSB0aHUgYmEgKFEzKSBjdWEgdGFwIG1hdSBHaXVhIGt5IGxhbiBsdW90IGxhICVzIHZhICVzIiwgUTFHSywgUTNHSykKCiMgVGluaCBRMSAmIFEzIGNobyB0YXAgbWF1IEN1b2kga3kKUTFDSyA9IHF1YW50aWxlKERpZW1DdWFNb2lTVkNLJFRvbmdEaWVtQ0ssMC4yNSkKUTNDSyA9IHF1YW50aWxlKERpZW1DdWFNb2lTVkNLJFRvbmdEaWVtQ0ssMC43NSkKc3ByaW50ZigiVHUgcGhhbiB2aSAocXVhcnRpbGUpIHRodSBuaGF0IChRMSkgdmEgdGh1IGJhIChRMykgY3VhIHRhcCBtYXUgQ3VvaSBreSBsYW4gbHVvdCBsYSAlcyB2YSAlcyIsIFExQ0ssIFEzQ0spCmBgYAoKYGBge3J9CiMgQ2F1IElJSS4xNAojIFRhbyBoYW0gdGluaCByYSB0YWJsZSBjaHVhIGNhIHNpbmggdmllbiBjbyBtdWMgZGllbSBHaXVhIGt5IGNhbyB0aHUgSwpHS0sgPC0gZnVuY3Rpb24oayl7CiAgdGVtcDwtdGFibGUocm91bmQoVG9uZ1NvQ2F1RHVuZ0N1YVNWR0skU29DYXVEdW5nLzI1KjEwLDEpKQogIG9wdGlvbnMoZGlnaXRzID0gMikKICBtdWMgPC0gYXMuZG91YmxlKG5hbWVzKHRlbXBbbGVuZ3RoKHRlbXApLSBrICsgMV0pKQogIERTIDwtIGRhdGFHS1tkYXRhR0tbLCJUb25nRGllbUdLIl0gPT0gbXVjLF0KICByZXR1cm4oRFMpCn0KCiMgVGFvIGhhbSB0aW5oIHJhIHRhYmxlIGNodWEgY2Egc2luaCB2aWVuIGNvIG11YyBkaWVtIEN1b2kga3kgY2FvIHRodSBLCkNLSyA8LSBmdW5jdGlvbihrKXsKICB0ZW1wPC10YWJsZShyb3VuZChUb25nU29DYXVEdW5nQ3VhU1ZDSyRTb0NhdUR1bmcvMjkqMTAsMSkpCiAgb3B0aW9ucyhkaWdpdHMgPSAyKQogIG11YyA8LSBhcy5kb3VibGUobmFtZXModGVtcFtsZW5ndGgodGVtcCktIGsgKyAxXSkpCiAgRFMgPC0gZGF0YUNLW2RhdGFDS1ssIlRvbmdEaWVtQ0siXSA9PSBtdWMsXQogIHJldHVybihEUykKfQoKIyBUYW8gdGFibGUgdm9pIHRhdCBjYSBjb2x1bW4gdmEgbGF5IG5odW5nIHJvdyBjbyBUb25nRGllbUdLIG8gbXVjIGRpZW0gY2FvIG5oYXQgdHJvbmcgdGFwIG1hdSBHaXVhIGt5IHZhIEN1b2kga3kKRFNTVlEzR0sgPC0gcmJpbmQoR0tLKDEpLCBHS0soMikpCkRTU1ZRM0NLIDwtIHJiaW5kKENLSygxKSwgQ0tLKDIpKQoKIyBTbyBsdW9uZyBzaW5oIHZpZW4gY2hpbmggbGEgc28gZG9uZyAocm93KSBjdWEgdGFibGUgbW9pIHRhbwpTb1NWUTNHSyA9IG5yb3coRFNTVlEzR0spClNvU1ZRM0NLID0gbnJvdyhEU1NWUTNDSykKc3ByaW50ZigiU28gc2luaCB2aWVuIGNvIGRpZW0gc28gbmFtIHRyb25nIDIgbXVjIGRpZW0gY2FvIG5oYXQgdHJvbmcgdGFwIEdpdWEga3kgbGEgJXMiLCBTb1NWUTNHSykKc3ByaW50ZigiU28gc2luaCB2aWVuIGNvIGRpZW0gc28gbmFtIHRyb25nIDIgbXVjIGRpZW0gY2FvIG5oYXQgdHJvbmcgdGFwIEN1b2kga3kgbGEgJXMiLCBTb1NWUTNDSykKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQojIENhdSBJSUkuMTUKIyBQbG90IGRpZW0gR2l1YSBreQojIFRhbyAxICB0YWJsZSBtb2kgZHVhIHRyZW4gY29sIFRvbmdEaWVtR0sgZGUgZGVtIHNvIG9jY3VycmVuY2UgY3VhIG1vaSBkaWVtIGxvbiBob24gUTMgY3VhIHRhcCBtYXUgR2l1YSBreQpkZkRlbURpZW1RM0dLIDwtIGRhdGEuZnJhbWUodGFibGUoRFNTVlEzR0skVG9uZ0RpZW1HSykpCmNvbG5hbWVzKGRmRGVtRGllbVEzR0spIDwtIGMoIkRpZW1HSyIsICJTb1NWIikKcGxvdERpZW1RM0dLIDwtIGdncGxvdChkZkRlbURpZW1RM0dLLCBhZXMoeD1EaWVtR0ssIHk9U29TVikpICsKICBnZW9tX2xpbmUoY29sb3I9ImdyZXkiLCBhZXMoZ3JvdXA9MSkpICsKICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSJzdGVlbGJsdWUiLCBzaXplPTYpICsgdGhlbWVfaXBzdW0oKSArCiAgeGxhYigiRGllbSIpICsgeWxhYigiU28gU2luaCB2aWVuIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGZpbGw9ImNvcm5zaWxrIiwgY29sb3VyPU5BKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9U29TViwgaGp1c3Q9LTEuNSwgdmp1c3Q9MCkpCgojIFBsb3QgZGllbSBjdW9pIGt5CiMgVGFvIDEgIHRhYmxlIG1vaSBkdWEgdHJlbiBjb2wgVG9uZ0RpZW1DSyBkZSBkZW0gc28gb2NjdXJyZW5jZSBjdWEgbW9pIGRpZW0gbG9uIGhvbiBRMyBjdWEgdGFwIG1hdSBDdW9pIGt5CmRmRGVtRGllbVEzQ0sgPC0gZGF0YS5mcmFtZSh0YWJsZShEU1NWUTNDSyRUb25nRGllbUNLKSkKY29sbmFtZXMoZGZEZW1EaWVtUTNDSykgPC0gYygiRGllbUNLIiwgIlNvU1YiKQpwbG90RGllbVEzQ0sgPC0gZ2dwbG90KGRmRGVtRGllbVEzQ0ssIGFlcyh4PURpZW1DSywgeT1Tb1NWKSkgKwogIGdlb21fbGluZShjb2xvcj0iZ3JleSIsIGFlcyhncm91cD0xKSkgKwogIGdlb21fcG9pbnQoc2hhcGU9MjEsIGNvbG9yPSJibGFjayIsIGZpbGw9ImNvcmFsMSIsIHNpemU9NikgKyB0aGVtZV9pcHN1bSgpICsKICB4bGFiKCJEaWVtIikgKyB5bGFiKCJTbyBTaW5oIHZpZW4iKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0iY29ybnNpbGsiLCBjb2xvdXI9TkEpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1Tb1NWLCBoanVzdD0tMS41LCB2anVzdD0wKSkKCiMgSGllbiB0aGkgMiBiaWV1IGRvCmcgPC0gZ3JpZC5hcnJhbmdlKAogIGFycmFuZ2VHcm9iKHBsb3REaWVtUTNHSywgYm90dG9tID0gIkRpZW0gR2l1YSBreSIpLAogIGFycmFuZ2VHcm9iKHBsb3REaWVtUTNDSywgYm90dG9tID0gIkRpZW0gQ3VvaSBreSIpLAogIG5yb3cgPSAyLCBuY29sID0gMQopCmcKIyBMdXUgaGluaCBhbmggdmFvIHRodSBtdWMgaGluaApnZ3NhdmUoImhpbmgvNTMxNTFfcGxvdHBob2RpZW1zaW5odmllblEzLmpwZyIsIGcpCmBgYApgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQojIENhdSBJSUkuMTYKIyBUYW4gZHVuZyBsYWkgMiBoYW0gR0tLICYgQ0tLIGRlIHRpbmggc28gc2luaCB2aWVuIGNvIG11YyBkaWVtIGNhbyB0aHUgSwojIERhdCBrID0gNQprID0gNQojIFRhbyB0YWJsZSB2b2kgdGF0IGNhIGNvbHVtbiB2YSBsYXkgbmh1bmcgcm93IGNvIFRvbmdEaWVtR0sgbyBtdWMgZGllbSBjYW8gdGh1IGsgdHJvbmcgdGFwIG1hdSBHaXVhIGt5IHZhIEN1b2kga3kKRFNTVl9LX0dLIDwtIEdLSyhrKSAKRFNTVl9LX0NLIDwtIENLSyhrKQoKIyBTbyBsdW9uZyBzaW5oIHZpZW4gY2hpbmggbGEgc28gZG9uZyAocm93KSBjdWEgdGFibGUgbW9pIHRhbwpTb1NWX0tfR0sgPSBucm93KERTU1ZfS19HSykKU29TVl9LX0NLID0gbnJvdyhEU1NWX0tfQ0spCnNwcmludGYoIlNvIHNpbmggdmllbiBjbyBkaWVtIHNvIHZvaSBtdWMgZGllbSBjYW8gdGh1ICVzIHRyb25nIHRhcCBHaXVhIGt5IGxhICVzIiwgaywgU29TVl9LX0dLKQpzcHJpbnRmKCJTbyBzaW5oIHZpZW4gY28gZGllbSBzbyB2b2kgbXVjIGRpZW0gY2FvIHRodSAlcyB0cm9uZyB0YXAgQ3VvaSBreSBsYSAlcyIsIGssIFNvU1ZRM0NLKQpgYGAKYGBge3IgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxMH0KIyBDYXUgSUlJLjE3CiMgUGxvdCBkaWVtIEdpdWEga3kKIyBUYW8gMSAgdGFibGUgbW9pIGR1YSB0cmVuIGNvbCBUb25nRGllbUdLIGRlIGRlbSBzbyBvY2N1cnJlbmNlIGN1YSBtb2kgZGllbSBsb24gaG9uIFEzIGN1YSB0YXAgbWF1IEdpdWEga3kKcGxvdERlbURpZW1LIDwtIGZ1bmN0aW9uKGt5dGhpLCBkc3N2KSB7CiAgaWYgKGt5dGhpID09ICJHSyIpIHsKICAgIGRmRGVtRGllbUsgPC0gZGF0YS5mcmFtZSh0YWJsZShkc3N2JFRvbmdEaWVtR0spKQogICAgY29sbmFtZXMoZGZEZW1EaWVtSykgPC0gYygiRGllbUdLIiwgIlNvU1YiKQogICAgcmV0dXJuKAogICAgICBnZ3Bsb3QoZGZEZW1EaWVtSywgYWVzKHg9RGllbUdLLCB5PVNvU1YpKSArCiAgICAgICAgZ2VvbV9saW5lKGNvbG9yPSJncmV5IiwgYWVzKGdyb3VwPTEpKSArCiAgICAgICAgZ2VvbV9wb2ludChzaGFwZT0yMSwgY29sb3I9ImJsYWNrIiwgZmlsbD0ic3RlZWxibHVlIiwgc2l6ZT02KSArIHRoZW1lX2lwc3VtKCkgKwogICAgICAgIHhsYWIoIkRpZW0iKSArIHlsYWIoIlNvIFNpbmggdmllbiIpICsKICAgICAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChmaWxsPSJjb3Juc2lsayIsIGNvbG91cj1OQSkpICsKICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPVNvU1YsIGhqdXN0PS0xLjUsIHZqdXN0PTApKQogICAgKQogIH0gZWxzZSBpZiAoa3l0aGkgPT0gIkNLIikgewogICAgZGZEZW1EaWVtSyA8LSBkYXRhLmZyYW1lKHRhYmxlKGRzc3YkVG9uZ0RpZW1DSykpCiAgICBjb2xuYW1lcyhkZkRlbURpZW1LKSA8LSBjKCJEaWVtQ0siLCAiU29TViIpCiAgICByZXR1cm4oCiAgICAgIGdncGxvdChkZkRlbURpZW1LLCBhZXMoeD1EaWVtQ0ssIHk9U29TVikpICsKICAgICAgICBnZW9tX2xpbmUoY29sb3I9ImdyZXkiLCBhZXMoZ3JvdXA9MSkpICsKICAgICAgICBnZW9tX3BvaW50KHNoYXBlPTIxLCBjb2xvcj0iYmxhY2siLCBmaWxsPSJjb3JhbDEiLCBzaXplPTYpICsgdGhlbWVfaXBzdW0oKSArCiAgICAgICAgeGxhYigiRGllbSIpICsgeWxhYigiU28gU2luaCB2aWVuIikgKwogICAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGZpbGw9ImNvcm5zaWxrIiwgY29sb3VyPU5BKSkgKwogICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9U29TViwgaGp1c3Q9LTEuNSwgdmp1c3Q9MCkpCiAgICApCiAgfQp9CgojIENob24gMyBLIGxhbiBsdW9pIGJhbmcgNSwgMywgOSBjaG8gY2EgMiB0YXAgbWF1IEdpdWEga3kgdmEgQ3VvaSBreQpkc3N2X2s1X0dLIDwtIEdLSyg1KQpkc3N2X2szX0dLIDwtIEdLSygzKQpkc3N2X2s5X0dLIDwtIEdLSyg5KQpkc3N2X0dLIDwtIHJiaW5kKGRzc3ZfazNfR0ssIGRzc3ZfazVfR0ssIGRzc3ZfazlfR0spCnBsb3REaWVtX0tfR0sgPC0gcGxvdERlbURpZW1LKCJHSyIsIGRzc3ZfR0spCgpkc3N2X2s1X0NLIDwtIENLSyg1KQpkc3N2X2szX0NLIDwtIENLSygzKQpkc3N2X2s5X0NLIDwtIENLSyg5KQpkc3N2X0NLIDwtIHJiaW5kKGRzc3ZfazNfQ0ssIGRzc3ZfazVfQ0ssIGRzc3ZfazlfQ0spCnBsb3REaWVtX0tfQ0sgPC0gcGxvdERlbURpZW1LKCJDSyIsIGRzc3ZfQ0spCgojIFZlIHRhYmxlIGNodWEgSwojIFRoZW1lIGNobyB0YWJsZQp0aG0gPC0gdHRoZW1lX21pbmltYWwoCiAgY29yZT1saXN0KGJnX3BhcmFtcyA9IGxpc3QoZmlsbCA9IGJsdWVzOVsxOjRdLCBjb2w9TkEpLAogICAgICAgICAgICBmZ19wYXJhbXM9bGlzdChmb250ZmFjZT0zKSksCiAgY29saGVhZD1saXN0KGZnX3BhcmFtcz1saXN0KGNvbD0ibmF2eWJsdWUiLCBmb250ZmFjZT00TCkpLAogIHJvd2hlYWQ9bGlzdChmZ19wYXJhbXM9bGlzdChjb2w9Im9yYW5nZSIsIGZvbnRmYWNlPTNMKSkpCgpkZlRhYmxlSyA8LSBkYXRhLmZyYW1lKAogIGsgPSBjKCIzIiwgIjUiLCAiOSIpLAogIERpZW1HSyA9IGMoZHNzdl9rM19HSyRUb25nRGllbUdLW1sxXV0sIGRzc3ZfazVfR0skVG9uZ0RpZW1HS1tbMV1dLCBkc3N2X2s5X0dLJFRvbmdEaWVtR0tbWzFdXSksCiAgRGllbUNLID0gYyhkc3N2X2szX0NLJFRvbmdEaWVtQ0tbWzFdXSwgZHNzdl9rNV9DSyRUb25nRGllbUNLW1sxXV0sIGRzc3ZfazlfQ0skVG9uZ0RpZW1DS1tbMV1dKQopCiMgRGFuIDIgdGFibGUgZGllbSBHaXVhIGt5IHZhIEN1b2kga3kKZyA8LSBncmlkLmFycmFuZ2UoCiAgdGFibGVHcm9iKGRmVGFibGVLLCB0aGVtZSA9IHRobSksCiAgbmNvbD0xCikKCiMgTHV1IGhpbmggYW5oIHZhbyB0aHUgbXVjIGhpbmgKIyBnZ3NhdmUoImhpbmgvNTMxNzFfdGhvbmd0aW5rLmpwZyIsIGcpCgojIEhpZW4gdGhpIDIgYmlldSBkbwpncmlkLm5ld3BhZ2UoKQpnIDwtIGdyaWQuYXJyYW5nZSgKICBhcnJhbmdlR3JvYihwbG90RGllbV9LX0dLLCBib3R0b20gPSAiRGllbSBHaXVhIGt5IiksCiAgYXJyYW5nZUdyb2IocGxvdERpZW1fS19DSywgYm90dG9tID0gIkRpZW0gQ3VvaSBreSIpLAogIG5yb3cgPSAyLCBuY29sID0gMQopCgojIEx1dSBoaW5oIGFuaCB2YW8gdGh1IG11YyBoaW5oCiMgZ2dzYXZlKCJoaW5oLzUzMTcyX3Bsb3RwaG9kaWVtc2luaHZpZW5LLmpwZyIsIGcpCmBgYAoKUGhhbiBJVgpgYGB7cn0KIyBJbXBvcnQgZHUgbGlldSB0aGkgR2l1YSBreQpERkdLIDwtIHJlYWQueGxzeDIoIjE5Ml9DTzEwMDcueGxzeCIsIHNoZWV0SW5kZXggPSAzLCBzdGFydFJvdyA9IDEsIGVuZFJvdyA9IDE2KQoKIyBJbXBvcnQgZHUgbGlldSB0aGkgQ3VvaSBreQpERkNLIDwtIHJlYWQueGxzeDIoIjE5Ml9DTzEwMDcueGxzeCIsIHNoZWV0SW5kZXggPSA1LCBzdGFydFJvdyA9IDEsIGVuZFJvdyA9IDE2KQpgYGAKCmBgYHtyfQojIFhhYyBkaW5oIGNhYyBjaHVhbiBkYXUgcmEgeHVhdCBoaWVuIHRyb25nIHRhcCBtYXUgR2l1YSBreQpHS0NEUiA8LSBERkdLWzc6MTAsIDE6MjZdCiMgVGFvIHJhIDEgbWF0cml4IGNvIGNoaWV1IGRhaSAxIHggbiAodm9pIG4gbGEgY29sdW1uIHR1IFgxIC0gWDI1KQpHS0NEUi4xOTIxIDwtIEdLQ0RSICU+JSBmaWx0ZXIoR0tDRFJbMV0gPT0gIjE5MjEiKSAlPiUgc2VsZWN0KFgxOlgyNSkgJT4lIGFwcGx5KDIsYXMubnVtZXJpYykKR0tDRFIuMTkyMiA8LSBHS0NEUiAlPiUgZmlsdGVyKEdLQ0RSWzFdID09ICIxOTIyIikgJT4lIHNlbGVjdChYMTpYMjUpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCkdLQ0RSLjE5MjMgPC0gR0tDRFIgJT4lIGZpbHRlcihHS0NEUlsxXSA9PSAiMTkyMyIpICU+JSBzZWxlY3QoWDE6WDI1KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpHS0NEUi4xOTI0IDwtIEdLQ0RSICU+JSBmaWx0ZXIoR0tDRFJbMV0gPT0gIjE5MjQiKSAlPiUgc2VsZWN0KFgxOlgyNSkgJT4lIGFwcGx5KDIsYXMubnVtZXJpYykKCiMgWGFjIGRpbmggY2FjIGNodWFuIGRhdSByYSB4dWF0IGhpZW4gdHJvbmcgdGFwIG1hdSBDdW9pIGt5CkNLQ0RSIDwtIERGQ0tbNzoxMCwgMTozMF0KIyBUYW8gcmEgMSBtYXRyaXggY28gY2hpZXUgZGFpIDEgeCBuICh2b2kgbiBsYSBjb2x1bW4gdHUgWDEgLSBYMjkpCkNLQ0RSLjE5MjEgPC0gQ0tDRFIgJT4lIGZpbHRlcihDS0NEUlsxXSA9PSAiMTkyMSIpICU+JSBzZWxlY3QoWDE6WDI5KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpDS0NEUi4xOTIyIDwtIENLQ0RSICU+JSBmaWx0ZXIoQ0tDRFJbMV0gPT0gIjE5MjIiKSAlPiUgc2VsZWN0KFgxOlgyOSkgJT4lIGFwcGx5KDIsYXMubnVtZXJpYykKQ0tDRFIuMTkyMyA8LSBDS0NEUiAlPiUgZmlsdGVyKENLQ0RSWzFdID09ICIxOTIzIikgJT4lIHNlbGVjdChYMTpYMjkpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCkNLQ0RSLjE5MjQgPC0gQ0tDRFIgJT4lIGZpbHRlcihDS0NEUlsxXSA9PSAiMTkyNCIpICU+JSBzZWxlY3QoWDE6WDI5KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpgYGAKCgpgYGB7cn0KIyBDYXUgSVYuMQojIHRhYmxlKEdLQ0RSLjE5MjEpIHNlIGdyb3VwIGNhYyBjaHVhbiBkYXUgcmEgbGFpIGN1bmcgdm9pIGNvdW50IGN1YSB0dW5nIGNodWFuIGRhdSByYS4KIyBTbyBsdW9uZyBjaHVhbiBkYXUgcmEgbGllbiBxdWFuIGRlbiBjYWMgY2F1IGhvaSB4dWF0IGhpZW4gdHJvbmcgdGFwIG1hdSBHaXVhIGt5CnNwcmludGYoIlNvIGx1b25nIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBkZSAxOTIxIHRyb25nIHRhcCBtYXUgR2l1YSBreSBsYSAlcyIsIGxlbmd0aChuYW1lcyh0YWJsZShHS0NEUi4xOTIxKSkpKQpzcHJpbnRmKCJTbyBsdW9uZyBjaHVhbiBkYXUgcmEgbGllbiBxdWFuIGRlbiBjYWMgY2F1IGhvaSB4dWF0IGhpZW4gdHJvbmcgZGUgMTkyMiB0cm9uZyB0YXAgbWF1IEdpdWEga3kgbGEgJXMiLCBsZW5ndGgobmFtZXModGFibGUoR0tDRFIuMTkyMikpKSkKc3ByaW50ZigiU28gbHVvbmcgY2h1YW4gZGF1IHJhIGxpZW4gcXVhbiBkZW4gY2FjIGNhdSBob2kgeHVhdCBoaWVuIHRyb25nIGRlIDE5MjMgdHJvbmcgdGFwIG1hdSBHaXVhIGt5IGxhICVzIiwgbGVuZ3RoKG5hbWVzKHRhYmxlKEdLQ0RSLjE5MjMpKSkpCnNwcmludGYoIlNvIGx1b25nIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBkZSAxOTI0IHRyb25nIHRhcCBtYXUgR2l1YSBreSBsYSAlcyIsIGxlbmd0aChuYW1lcyh0YWJsZShHS0NEUi4xOTI0KSkpKQpgYGAKCmBgYHtyfQojIFNvIGx1b25nIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyB0YXAgbWF1IEN1b2kga3kKc3ByaW50ZigiU28gbHVvbmcgY2h1YW4gZGF1IHJhIGxpZW4gcXVhbiBkZW4gY2FjIGNhdSBob2kgeHVhdCBoaWVuIHRyb25nIGRlIDE5MjEgdHJvbmcgdGFwIG1hdSBDdW9pIGt5IGxhICVzIiwgbGVuZ3RoKG5hbWVzKHRhYmxlKENLQ0RSLjE5MjEpKSkpCnNwcmludGYoIlNvIGx1b25nIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBkZSAxOTIyIHRyb25nIHRhcCBtYXUgQ3VvaSBreSBsYSAlcyIsIGxlbmd0aChuYW1lcyh0YWJsZShDS0NEUi4xOTIyKSkpKQpzcHJpbnRmKCJTbyBsdW9uZyBjaHVhbiBkYXUgcmEgbGllbiBxdWFuIGRlbiBjYWMgY2F1IGhvaSB4dWF0IGhpZW4gdHJvbmcgZGUgMTkyMyB0cm9uZyB0YXAgbWF1IEN1b2kga3kgbGEgJXMiLCBsZW5ndGgobmFtZXModGFibGUoQ0tDRFIuMTkyMykpKSkKc3ByaW50ZigiU28gbHVvbmcgY2h1YW4gZGF1IHJhIGxpZW4gcXVhbiBkZW4gY2FjIGNhdSBob2kgeHVhdCBoaWVuIHRyb25nIGRlIDE5MjQgdHJvbmcgdGFwIG1hdSBDdW9pIGt5IGxhICVzIiwgbGVuZ3RoKG5hbWVzKHRhYmxlKENLQ0RSLjE5MjQpKSkpCmBgYAoKYGBge3J9CiMgQ2F1IElWLjIKIyBEYW5oIHNhY2ggY2FjIGNodWFuIGRhdSByYSBjaGkgdGlldCBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyB0YXAgbWF1IEdpdWEga3kKIyBOT1RFOiBuYW1lcyhbdGFibGUtb2JqZWN0XSkgLT4gbGF5IHRhdCBjYSAKIyBOT1RFOiBwYXN0ZShbbGlzdC1vYmplY3RdLCBjb2xsYXBzZSA9ICIsICIpID0+IGNodXllbiBsaXN0IHRoYW5oIHN0cmluZyBjYWNoIG5oYXUgYmFuZyBkYXUgIiwgIgpzcHJpbnRmKCJEYW5oIHNhY2ggY2FjIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBtYSBkZSAxOTIxIHRyb25nIHRhcCBtYXUgR2l1YSBreSBsYW4gbHVvdCBsYSAlcyIsIHBhc3RlKG5hbWVzKHRhYmxlKEdLQ0RSLjE5MjEpKSwgY29sbGFwc2UgPSAnLCAnKSkKc3ByaW50ZigiRGFuaCBzYWNoIGNhYyBjaHVhbiBkYXUgcmEgbGllbiBxdWFuIGRlbiBjYWMgY2F1IGhvaSB4dWF0IGhpZW4gdHJvbmcgbWEgZGUgMTkyMiB0cm9uZyB0YXAgbWF1IEdpdWEga3kgbGFuIGx1b3QgbGEgJXMiLCBwYXN0ZShuYW1lcyh0YWJsZShHS0NEUi4xOTIyKSksIGNvbGxhcHNlID0gJywgJykpCnNwcmludGYoIkRhbmggc2FjaCBjYWMgY2h1YW4gZGF1IHJhIGxpZW4gcXVhbiBkZW4gY2FjIGNhdSBob2kgeHVhdCBoaWVuIHRyb25nIG1hIGRlIDE5MjMgdHJvbmcgdGFwIG1hdSBHaXVhIGt5IGxhbiBsdW90IGxhICVzIiwgcGFzdGUobmFtZXModGFibGUoR0tDRFIuMTkyMykpLCBjb2xsYXBzZSA9ICcsICcpKQpzcHJpbnRmKCJEYW5oIHNhY2ggY2FjIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBtYSBkZSAxOTI0IHRyb25nIHRhcCBtYXUgR2l1YSBreSBsYW4gbHVvdCBsYSAlcyIsIHBhc3RlKG5hbWVzKHRhYmxlKEdLQ0RSLjE5MjQpKSwgY29sbGFwc2UgPSAnLCcpKQpgYGAKCmBgYHtyfQojIERhbmggc2FjaCBjYWMgY2h1YW4gZGF1IHJhIGNoaSB0aWV0IGxpZW4gcXVhbiBkZW4gY2FjIGNhdSBob2kgeHVhdCBoaWVuIHRyb25nIHRhcCBtYXUgQ3VvaSBreQpzcHJpbnRmKCJEYW5oIHNhY2ggY2FjIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBtYSBkZSAxOTIxIHRyb25nIHRhcCBtYXUgQ3VvaSBreSBsYW4gbHVvdCBsYSAlcyIsIHBhc3RlKG5hbWVzKHRhYmxlKENLQ0RSLjE5MjEpKSwgY29sbGFwc2UgPSAnLCAnKSkKc3ByaW50ZigiRGFuaCBzYWNoIGNhYyBjaHVhbiBkYXUgcmEgbGllbiBxdWFuIGRlbiBjYWMgY2F1IGhvaSB4dWF0IGhpZW4gdHJvbmcgbWEgZGUgMTkyMiB0cm9uZyB0YXAgbWF1IEN1b2kga3kgbGFuIGx1b3QgbGEgJXMiLCBwYXN0ZShuYW1lcyh0YWJsZShDS0NEUi4xOTIyKSksIGNvbGxhcHNlID0gJywgJykpCnNwcmludGYoIkRhbmggc2FjaCBjYWMgY2h1YW4gZGF1IHJhIGxpZW4gcXVhbiBkZW4gY2FjIGNhdSBob2kgeHVhdCBoaWVuIHRyb25nIG1hIGRlIDE5MjMgdHJvbmcgdGFwIG1hdSBDdW9pIGt5IGxhbiBsdW90IGxhICVzIiwgcGFzdGUobmFtZXModGFibGUoQ0tDRFIuMTkyMykpLCBjb2xsYXBzZSA9ICcsICcpKQpzcHJpbnRmKCJEYW5oIHNhY2ggY2FjIGNodWFuIGRhdSByYSBsaWVuIHF1YW4gZGVuIGNhYyBjYXUgaG9pIHh1YXQgaGllbiB0cm9uZyBtYSBkZSAxOTI0IHRyb25nIHRhcCBtYXUgQ3VvaSBreSBsYW4gbHVvdCBsYSAlcyIsIHBhc3RlKG5hbWVzKHRhYmxlKENLQ0RSLjE5MjQpKSwgY29sbGFwc2UgPSAnLCAnKSkKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aCA9IDE1fQojIENhdSBJVi4zCiNHcmFwaCBUYW4gc3VhdCBjdWEgQ2h1YW4gZGF1IHJhIG8gdGFwIG1hdSBHaXVhIGt5CkczR0suZGF0YTE5MjEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShHS0NEUi4xOTIxKSkKRzNHSy5kYXRhMTkyMiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKEdLQ0RSLjE5MjIpKQpHM0dLLmRhdGExOTIzIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoR0tDRFIuMTkyMykpCkczR0suZGF0YTE5MjQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShHS0NEUi4xOTI0KSkKI01EIDE5MjEsIDE5MjMsIDE5MjQgc2hhcmUgbXV0dWFsIGZyZXF1ZW5jeQoKRzNHSzE5MjEgPC0gZ2dwbG90KEczR0suZGF0YTE5MjEsIGFlcyh4ID0gR0tDRFIuMTkyMSx5ID1HM0dLLmRhdGExOTIxWywyXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1HM0dLLmRhdGExOTIxWywyXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiQmlldSBkbyB0YW4gc3VhdCBMZWFybmluZyBvdXRjb21lIEdLLTE5MjEgIiwgeCA9ICJMZWFybmluZyBvdXRjb21lIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmZmFhODAiKSkKCkczR0sxOTIyIDwtIGdncGxvdChHM0dLLmRhdGExOTIyLCBhZXMoeCA9IEdLQ0RSLjE5MjIseSA9RzNHSy5kYXRhMTkyMlssMl0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9RzNHSy5kYXRhMTkyMlssMl0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkJpZXUgZG8gdGFuIHN1YXQgTGVhcm5pbmcgb3V0Y29tZSBHSy0xOTIyIiwgeCA9ICJMZWFybmluZyBvdXRjb21lIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmZmFhODAiKSkKCkczR0sxOTIzIDwtIGdncGxvdChHM0dLLmRhdGExOTIzLCBhZXMoeCA9IEdLQ0RSLjE5MjMseSA9RzNHSy5kYXRhMTkyM1ssMl0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9RzNHSy5kYXRhMTkyM1ssMl0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkJpZXUgZG8gdGFuIHN1YXQgTGVhcm5pbmcgb3V0Y29tZSBHSy0xOTIyIiwgeCA9ICJMZWFybmluZyBvdXRjb21lIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmZmFhODAiKSkKCkczR0sxOTI0IDwtIGdncGxvdChHM0dLLmRhdGExOTI0LCBhZXMoeCA9IEdLQ0RSLjE5MjQseSA9RzNHSy5kYXRhMTkyNFssMl0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9RzNHSy5kYXRhMTkyNFssMl0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkJpZXUgZG8gdGFuIHN1YXQgTGVhcm5pbmcgb3V0Y29tZSBHSy0xOTIyIiwgeCA9ICJMZWFybmluZyBvdXRjb21lIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNmZmFhODAiKSkKCkczR0sgPC0gZ2dhcnJhbmdlKEczR0sxOTIxLCBHM0dLMTkyMiwgRzNHSzE5MjMsIEczR0sxOTI0LCBuY29sID0gMiwgbnJvdyA9IDIpCkczR0sKIyBnZ3NhdmUoImhpbmgvNTQzMV9wbG90Y2h1YW5kYXVyYWdrLmpwZyIsIEczR0spCmBgYAoKYGBge3IgZmlnLmhlaWdodCA9IDE1LCBmaWcud2lkdGggPSAxNX0KI0dyYXBoIFRhbiBzdWF0IGN1YSBDaHVhbiBkYXUgcmEgbyB0YXAgbWF1IEN1b2kga3kKRzNDSy5kYXRhMTkyMSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKENLQ0RSLjE5MjEpKQpHM0NLLmRhdGExOTIyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoQ0tDRFIuMTkyMikpCkczQ0suZGF0YTE5MjMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShDS0NEUi4xOTIzKSkKRzNDSy5kYXRhMTkyNCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKENLQ0RSLjE5MjQpKQojTUQgMTkyMSwgMTkyMywgMTkyNCBzaGFyZSBtdXR1YWwgZnJlcXVlbmN5CgpHM0NLMTkyMSA8LSBnZ3Bsb3QoRzNDSy5kYXRhMTkyMSwgYWVzKHggPSBDS0NEUi4xOTIxLHkgPUczQ0suZGF0YTE5MjFbLDJdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUczQ0suZGF0YTE5MjFbLDJdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJCaWV1IGRvIHRhbiBzdWF0IExlYXJuaW5nIG91dGNvbWUgR0stMTkyMSAiLCB4ID0gIkxlYXJuaW5nIG91dGNvbWUiLCB5ID0gIkZyZXF1ZW5jeSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiY29ybnNpbGsiKSkKCkczQ0sxOTIyIDwtIGdncGxvdChHM0NLLmRhdGExOTIyLCBhZXMoeCA9IENLQ0RSLjE5MjIseSA9RzNDSy5kYXRhMTkyMlssMl0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9RzNDSy5kYXRhMTkyMlssMl0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkJpZXUgZG8gdGFuIHN1YXQgTGVhcm5pbmcgb3V0Y29tZSBHSy0xOTIyIiwgeCA9ICJMZWFybmluZyBvdXRjb21lIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImNvcm5zaWxrIikpCgpHM0NLMTkyMyA8LSBnZ3Bsb3QoRzNDSy5kYXRhMTkyMywgYWVzKHggPSBDS0NEUi4xOTIzLHkgPUczQ0suZGF0YTE5MjNbLDJdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUczQ0suZGF0YTE5MjNbLDJdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJCaWV1IGRvIHRhbiBzdWF0IExlYXJuaW5nIG91dGNvbWUgR0stMTkyMiIsIHggPSAiTGVhcm5pbmcgb3V0Y29tZSIsIHkgPSAiRnJlcXVlbmN5IikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJjb3Juc2lsayIpKQoKRzNDSzE5MjQgPC0gZ2dwbG90KEczQ0suZGF0YTE5MjQsIGFlcyh4ID0gQ0tDRFIuMTkyNCx5ID1HM0NLLmRhdGExOTI0WywyXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1HM0NLLmRhdGExOTI0WywyXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiQmlldSBkbyB0YW4gc3VhdCBMZWFybmluZyBvdXRjb21lIEdLLTE5MjIiLCB4ID0gIkxlYXJuaW5nIG91dGNvbWUiLCB5ID0gIkZyZXF1ZW5jeSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiY29ybnNpbGsiKSkKCkczQ0sgPC0gZ2dhcnJhbmdlKEczQ0sxOTIxLCBHM0NLMTkyMiwgRzNDSzE5MjMsIEczQ0sxOTI0LCBuY29sID0gMiwgbnJvdyA9IDIpCkczQ0sKIyBnZ3NhdmUoImhpbmgvNTQzMl9wbG90Y2h1YW5kYXVyYWNrLmpwZyIsIEczR0spCmBgYApgYGB7ciBmaWcuaGVpZ2h0ID0gMjAsIGZpZy53aWR0aCA9IDI1fQojIFRhbyBkYXRhZnJhbWUgdHUgZmlsZSBFeGNlbCAKRGllbUdLIDwtIHJlYWQueGxzeDIoIjE5Ml9DTzEwMDcueGxzeCIsIHNoZWV0SW5kZXggPSAyLCBzdGFydFJvdyA9IDUpCgojIERvbiBjYWMgdHJ1b25nIGNvIGt5IHR1IHJvbmcKRGllbUdLIDwtIERpZW1HSyAlPiUgZmlsdGVyKE5vICE9ICIiKQojIFRhbyBtYXRyaXggbW9pIApEaWVtR0sgPC0gc3Vic2V0KERpZW1HSywgc2VsZWN0ID0gIE5vOk1BREUpCgpEaWVtR0suMTkyMSA8LSBEaWVtR0sgJT4lIGZpbHRlcihNQURFID09IDE5MjEpICU+JSBzZWxlY3QoWDE6WDI1KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpEaWVtR0suMTkyMiA8LSBEaWVtR0sgJT4lIGZpbHRlcihNQURFID09IDE5MjIpICU+JSBzZWxlY3QoWDE6WDI1KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpEaWVtR0suMTkyMyA8LSBEaWVtR0sgJT4lIGZpbHRlcihNQURFID09IDE5MjMpICU+JSBzZWxlY3QoWDE6WDI1KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpEaWVtR0suMTkyNCA8LSBEaWVtR0sgJT4lIGZpbHRlcihNQURFID09IDE5MjQpICU+JSBzZWxlY3QoWDE6WDI1KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQoKI0FkZCBMZWFybmluZyBvdXRjb21lIGF0IHRvcCBvZiBkYXRhIGZyYW1lCkRpZW1HSy4xOTIxLkxPIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoR0tDRFIuMTkyMSxEaWVtR0suMTkyMSkpCkRpZW1HSy4xOTIyLkxPIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoR0tDRFIuMTkyMixEaWVtR0suMTkyMikpCkRpZW1HSy4xOTIzLkxPIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoR0tDRFIuMTkyMyxEaWVtR0suMTkyMykpCkRpZW1HSy4xOTI0LkxPIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoR0tDRFIuMTkyNCxEaWVtR0suMTkyNCkpCgojTGVhcm5pbmcgb3V0Y29tZSBuYW1lIGluIG1pZHRlcm0KbmFtZXModGFibGUoR0tDRFIuMTkyMSkpCgojMTkyMQojIFBoYW4gbG9haSB0aGVvIGNhYyBjaHVhbiBkYXUgcmEKRGllbUdLLjE5MjEuTE8xMSA8LSBEaWVtR0suMTkyMS5MT1stMSxEaWVtR0suMTkyMS5MT1sxLF0gPT0gMTFdCkRpZW1HSy4xOTIxLkxPMTIgPC0gRGllbUdLLjE5MjEuTE9bLTEsRGllbUdLLjE5MjEuTE9bMSxdID09IDEyXQpEaWVtR0suMTkyMS5MTzIxIDwtIERpZW1HSy4xOTIxLkxPWy0xLERpZW1HSy4xOTIxLkxPWzEsXSA9PSAyMV0KRGllbUdLLjE5MjEuTE8yMiA8LSBEaWVtR0suMTkyMS5MT1stMSxEaWVtR0suMTkyMS5MT1sxLF0gPT0gMjJdCkRpZW1HSy4xOTIxLkxPMzEgPC0gRGllbUdLLjE5MjEuTE9bLTEsRGllbUdLLjE5MjEuTE9bMSxdID09IDMxXQoKIyBDb25nIHRvbmcgdGhlbyBkb25nIGN1YSBkYXRhZnJhbWUgdmEgdGhlbSBUb25nIG1vaSB2YW8gdHJvbmcgZGF0YQpEaWVtR0suMTkyMS5MTzExIDwtdGFibGUoYXBwbHkoRGllbUdLLjE5MjEuTE8xMSwgMSwgc3VtKSkKRGllbUdLLjE5MjEuTE8xMiA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTIxLkxPMTIsIDEsIHN1bSkpCkRpZW1HSy4xOTIxLkxPMjEgPC10YWJsZShhcHBseShEaWVtR0suMTkyMS5MTzIxLCAxLCBzdW0pKQpEaWVtR0suMTkyMS5MTzIyIDwtdGFibGUoYXBwbHkoRGllbUdLLjE5MjEuTE8yMiwgMSwgc3VtKSkKRGllbUdLLjE5MjEuTE8zMSA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTIxLkxPMzEsIDEsIHN1bSkpCgoKIzE5MjIKI1NvcnRpbmcgYW5zd2VyIGludG8gbGVhcm5pbmcgb3V0Y29tZSBncm91cAoKRGllbUdLLjE5MjIuTE8xMSA8LSBEaWVtR0suMTkyMi5MT1stMSxEaWVtR0suMTkyMi5MT1sxLF0gPT0gMTFdCkRpZW1HSy4xOTIyLkxPMTIgPC0gRGllbUdLLjE5MjIuTE9bLTEsRGllbUdLLjE5MjIuTE9bMSxdID09IDEyXQpEaWVtR0suMTkyMi5MTzIxIDwtIERpZW1HSy4xOTIyLkxPWy0xLERpZW1HSy4xOTIyLkxPWzEsXSA9PSAyMV0KRGllbUdLLjE5MjIuTE8yMiA8LSBEaWVtR0suMTkyMi5MT1stMSxEaWVtR0suMTkyMi5MT1sxLF0gPT0gMjJdCkRpZW1HSy4xOTIyLkxPMzEgPC0gRGllbUdLLjE5MjIuTE9bLTEsRGllbUdLLjE5MjIuTE9bMSxdID09IDMxXQpEaWVtR0suMTkyMi5MTzIzIDwtIERpZW1HSy4xOTIyLkxPWy0xLERpZW1HSy4xOTIyLkxPWzEsXSA9PSAyM10KCiNTdW0gcm93IGRhdGEgZnJhbWUgYW5kIG1hcCBzdW0gcmVzdWx0IGludG8gaW5zdGFuY2UgZ3JvdXAKRGllbUdLLjE5MjIuTE8xMSA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTIyLkxPMTEsIDEsIHN1bSkpCkRpZW1HSy4xOTIyLkxPMTIgPC10YWJsZShhcHBseShEaWVtR0suMTkyMi5MTzEyLCAxLCBzdW0pKQpEaWVtR0suMTkyMi5MTzIxIDwtdGFibGUoYXBwbHkoRGllbUdLLjE5MjIuTE8yMSwgMSwgc3VtKSkKRGllbUdLLjE5MjIuTE8yMiA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTIyLkxPMjIsIDEsIHN1bSkpCkRpZW1HSy4xOTIyLkxPMzEgPC10YWJsZShhcHBseShEaWVtR0suMTkyMi5MTzMxLCAxLCBzdW0pKQpEaWVtR0suMTkyMi5MTzIzIDwtdGFibGUoRGllbUdLLjE5MjIuTE8yMykKIzE5MjMKI1NvcnRpbmcgYW5zd2VyIGludG8gbGVhcm5pbmcgb3V0Y29tZSBncm91cAoKRGllbUdLLjE5MjMuTE8xMSA8LSBEaWVtR0suMTkyMy5MT1stMSxEaWVtR0suMTkyMy5MT1sxLF0gPT0gMTFdCkRpZW1HSy4xOTIzLkxPMTIgPC0gRGllbUdLLjE5MjMuTE9bLTEsRGllbUdLLjE5MjMuTE9bMSxdID09IDEyXQpEaWVtR0suMTkyMy5MTzIxIDwtIERpZW1HSy4xOTIzLkxPWy0xLERpZW1HSy4xOTIzLkxPWzEsXSA9PSAyMV0KRGllbUdLLjE5MjMuTE8yMiA8LSBEaWVtR0suMTkyMy5MT1stMSxEaWVtR0suMTkyMy5MT1sxLF0gPT0gMjJdCkRpZW1HSy4xOTIzLkxPMzEgPC0gRGllbUdLLjE5MjMuTE9bLTEsRGllbUdLLjE5MjMuTE9bMSxdID09IDMxXQpEaWVtR0suMTkyMy5MTzMxIDwtIERpZW1HSy4xOTIzLkxPWy0xLERpZW1HSy4xOTIzLkxPWzEsXSA9PSAzMV0KCiNTdW0gcm93IGRhdGEgZnJhbWUgYW5kIG1hcCBzdW0gcmVzdWx0IGludG8gaW5zdGFuY2UgZ3JvdXAKRGllbUdLLjE5MjMuTE8xMSA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTIzLkxPMTEsIDEsIHN1bSkpCkRpZW1HSy4xOTIzLkxPMTIgPC10YWJsZShhcHBseShEaWVtR0suMTkyMy5MTzEyLCAxLCBzdW0pKQpEaWVtR0suMTkyMy5MTzIxIDwtdGFibGUoYXBwbHkoRGllbUdLLjE5MjMuTE8yMSwgMSwgc3VtKSkKRGllbUdLLjE5MjMuTE8yMiA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTIzLkxPMjIsIDEsIHN1bSkpCkRpZW1HSy4xOTIzLkxPMzEgPC10YWJsZShhcHBseShEaWVtR0suMTkyMy5MTzMxLCAxLCBzdW0pKQoKCiMxOTI0CiMgUGhhbiBsb2FpIHRoZW8gY2FjIGNodWFuIGRhdSByYQpEaWVtR0suMTkyNC5MTzExIDwtIERpZW1HSy4xOTI0LkxPWy0xLERpZW1HSy4xOTI0LkxPWzEsXSA9PSAxMV0KRGllbUdLLjE5MjQuTE8xMiA8LSBEaWVtR0suMTkyNC5MT1stMSxEaWVtR0suMTkyNC5MT1sxLF0gPT0gMTJdCkRpZW1HSy4xOTI0LkxPMjEgPC0gRGllbUdLLjE5MjQuTE9bLTEsRGllbUdLLjE5MjQuTE9bMSxdID09IDIxXQpEaWVtR0suMTkyNC5MTzIyIDwtIERpZW1HSy4xOTI0LkxPWy0xLERpZW1HSy4xOTI0LkxPWzEsXSA9PSAyMl0KRGllbUdLLjE5MjQuTE8zMSA8LSBEaWVtR0suMTkyNC5MT1stMSxEaWVtR0suMTkyNC5MT1sxLF0gPT0gMzFdCgojIENvbmcgdG9uZyB0aGVvIGRvbmcgY3VhIGRhdGFmcmFtZSB2YSB0aGVtIFRvbmcgbW9pIHZhbyB0cm9uZyBkYXRhCkRpZW1HSy4xOTI0LkxPMTEgPC10YWJsZShhcHBseShEaWVtR0suMTkyNC5MTzExLCAxLCBzdW0pKQpEaWVtR0suMTkyNC5MTzEyIDwtdGFibGUoYXBwbHkoRGllbUdLLjE5MjQuTE8xMiwgMSwgc3VtKSkKRGllbUdLLjE5MjQuTE8yMSA8LXRhYmxlKGFwcGx5KERpZW1HSy4xOTI0LkxPMjEsIDEsIHN1bSkpCkRpZW1HSy4xOTI0LkxPMjIgPC10YWJsZShhcHBseShEaWVtR0suMTkyNC5MTzIyLCAxLCBzdW0pKQpEaWVtR0suMTkyNC5MTzMxIDwtdGFibGUoYXBwbHkoRGllbUdLLjE5MjQuTE8zMSwgMSwgc3VtKSkKCiMgTGVhcm5pbmcgb3V0Y29tZSAxMQpMT1IuR0sxMSA8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyhEaWVtR0suMTkyMS5MTzExLERpZW1HSy4xOTIyLkxPMTEsRGllbUdLLjE5MjMuTE8xMSxEaWVtR0suMTkyNC5MTzExKSkKIyBUaGF5IGNhYyBnaWEgdHJpIE4vQSB0aGFuaCAwCkxPUi5HSzExW2lzLm5hKExPUi5HSzExKV0gPC0gMAojIENvbmcgdGhlbyBkb25nCkxPUi5HSzExIDwtIGFzLmRhdGEuZnJhbWUoYXBwbHkoTE9SLkdLMTEsMixzdW0pKQpMT1IuR0sxMSRTb0NhdVRMRHVuZyA8LSByb3cubmFtZXMoTE9SLkdLMTEpCgojIHhhcCBzZXAgbGFpIGRhdGEKTE9SLkdLMTE8LSB0cmFuc2Zvcm0oTE9SLkdLMTEsIFNvQ2F1VExEdW5nID0gYXMubnVtZXJpYyhTb0NhdVRMRHVuZykpCkxPUi5HSzExPC0gYXJyYW5nZShMT1IuR0sxMSxTb0NhdVRMRHVuZykKCiNMZWFybmluZyBvdXRjb21lIDEyIChtZXJnZSBpbnRvIHVzYWJsZSBkYXRhIGZyYW1lKQpMT1IuR0sxMiA8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyhEaWVtR0suMTkyMS5MTzEyLERpZW1HSy4xOTIyLkxPMTIsRGllbUdLLjE5MjMuTE8xMixEaWVtR0suMTkyNC5MTzEyKSkKI0ZpbGwgTi9BIGNlbGwgd2l0aCAwCkxPUi5HSzEyW2lzLm5hKExPUi5HSzEyKV0gPC0gMAojU3VtIGNvbHVtbgpMT1IuR0sxMiA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KExPUi5HSzEyLDIsc3VtKSkKTE9SLkdLMTIkU29DYXVUTER1bmcgPC0gcm93Lm5hbWVzKExPUi5HSzEyKQoKCiNMZWFybmluZyBvdXRjb21lIDIxIChtZXJnZSBpbnRvIHVzYWJsZSBkYXRhIGZyYW1lKQpMT1IuR0syMSA8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyhEaWVtR0suMTkyMS5MTzIxLERpZW1HSy4xOTIyLkxPMjEsRGllbUdLLjE5MjMuTE8yMSxEaWVtR0suMTkyNC5MTzIxKSkKI0ZpbGwgTi9BIGNlbGwgd2l0aCAwCkxPUi5HSzIxW2lzLm5hKExPUi5HSzIxKV0gPC0gMAojU3VtIGNvbHVtbgpMT1IuR0syMSA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KExPUi5HSzIxLDIsc3VtKSkKCkxPUi5HSzIxJFNvQ2F1VExEdW5nIDwtIHJvdy5uYW1lcyhMT1IuR0syMSkKCgojTGVhcm5pbmcgb3V0Y29tZSAyMiAobWVyZ2UgaW50byB1c2FibGUgZGF0YSBmcmFtZSkKTE9SLkdLMjIgPC0gYXMuZGF0YS5mcmFtZShiaW5kX3Jvd3MoRGllbUdLLjE5MjEuTE8yMixEaWVtR0suMTkyMi5MTzIyLERpZW1HSy4xOTIzLkxPMjIsRGllbUdLLjE5MjQuTE8yMikpCiNGaWxsIE4vQSBjZWxsIHdpdGggMApMT1IuR0syMltpcy5uYShMT1IuR0syMildIDwtIDAKI1N1bSBjb2x1bW4KTE9SLkdLMjIgPC0gYXMuZGF0YS5mcmFtZShhcHBseShMT1IuR0syMiwyLHN1bSkpCgpMT1IuR0syMiRTb0NhdVRMRHVuZyA8LSByb3cubmFtZXMoTE9SLkdLMjIpCgoKI0xlYXJuaW5nIG91dGNvbWUgMzEgKG1lcmdlIGludG8gdXNhYmxlIGRhdGEgZnJhbWUpCkxPUi5HSzMxIDwtIGFzLmRhdGEuZnJhbWUoYmluZF9yb3dzKERpZW1HSy4xOTIxLkxPMzEsRGllbUdLLjE5MjIuTE8zMSxEaWVtR0suMTkyMy5MTzMxLERpZW1HSy4xOTI0LkxPMzEpKQojRmlsbCBOL0EgY2VsbCB3aXRoIDAKTE9SLkdLMzFbaXMubmEoTE9SLkdLMzEpXSA8LSAwCiNTdW0gY29sdW1uCkxPUi5HSzMxIDwtIGFzLmRhdGEuZnJhbWUoYXBwbHkoTE9SLkdLMzEsMixzdW0pKQoKTE9SLkdLMzEkU29DYXVUTER1bmcgPC0gcm93Lm5hbWVzKExPUi5HSzMxKQoKI0xlYXJuaW5nIG91dGNvbWUgMjMKTE9SLkdLMjMgPC1hcy5kYXRhLmZyYW1lKERpZW1HSy4xOTIyLkxPMjMpCkxPUi5HSzIzJFNvQ2F1VHJhTG9pRHVuZyA8LSBMT1IuR0syM1ssMV0KCkdMT1IuR0sxMSA8LSBnZ3Bsb3QoTE9SLkdLMTEsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPUi5HSzExWywyXSksIHkgPSBMT1IuR0sxMVssMV0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9SLkdLMTFbLDFdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDExIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBkdW5nIiwgeSA9ICJTbyBzaW5oIHZpZW4iKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9SLkdLMTIgPC0gIGdncGxvdChMT1IuR0sxMiwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9SLkdLMTJbLDJdKSwgeSA9IExPUi5HSzEyWywxXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1IuR0sxMlssMV0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMTIiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIGR1bmciLCB5ID0gIlNvIHNpbmggdmllbiIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1IuR0syMSA8LSBnZ3Bsb3QoTE9SLkdLMjEsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPUi5HSzIxWywyXSksIHkgPSBMT1IuR0syMVssMV0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9SLkdLMjFbLDFdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDIxIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBkdW5nIiwgeSA9ICJTbyBzaW5oIHZpZW4iKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9SLkdLMjIgPC0gIGdncGxvdChMT1IuR0syMiwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9SLkdLMjJbLDJdKSwgeSA9IExPUi5HSzIyWywxXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1IuR0syMlssMV0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMjIiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIGR1bmciLCB5ID0gIlNvIHNpbmggdmllbiIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1IuR0szMSA8LSBnZ3Bsb3QoTE9SLkdLMzEsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPUi5HSzMxWywyXSksIHkgPSBMT1IuR0szMVssMV0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9SLkdLMzFbLDFdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDMxIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBkdW5nIiwgeSA9ICJTbyBzaW5oIHZpZW4iKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9SLkdLMjMgPC0gZ2dwbG90KExPUi5HSzIzLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1IuR0syM1ssM10pLCB5ID0gTE9SLkdLMjNbLDJdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPUi5HSzIzWywyXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAyMyIsIHggPSAiU28gY2F1IHRyYSBsb2kgZHVuZyIsIHkgPSAiU28gc2luaCB2aWVuIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Q1NTdkNSIpKQoKCkdMT1IuR0sgPC1nZ2FycmFuZ2UoR0xPUi5HSzExLEdMT1IuR0sxMixHTE9SLkdLMjEsR0xPUi5HSzIyLEdMT1IuR0syMyxHTE9SLkdLMzEsIG5jb2wgPSAzLCBucm93ID0gMikKR0xPUi5HSwojIGdnc2F2ZSgiaGluaC81NDUxX2JpZXVkb291dGNvbWVfZ2suanBnIiwgR0xPUi5HSykKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aCA9IDE1fQojIFRhbyBkYXRhZnJhbWUgdHUgZmlsZSBleGNlbCBjaG8gdGFwIG1hdSBDdW9pIGt5CkRpZW1DSyA8LSByZWFkLnhsc3gyKCIxOTJfQ08xMDA3Lnhsc3giLCBzaGVldEluZGV4ID0gNCwgc3RhcnRSb3cgPSA1KQojIExvYyBObyByb25nCkRpZW1DSyA8LSBEaWVtQ0sgJT4lIGZpbHRlcihObyAhPSAiIikKIyBUYW8gbWF0cml4CkRpZW1DSyA8LSBzdWJzZXQoRGllbUNLLCBzZWxlY3QgPSAgTm86TUFERSkKCkRpZW1DSy4xOTIxIDwtIERpZW1DSyAlPiUgZmlsdGVyKE1BREUgPT0gMTkyMSkgJT4lIHNlbGVjdChYMTpYMjkpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCkRpZW1DSy4xOTIyIDwtIERpZW1DSyAlPiUgZmlsdGVyKE1BREUgPT0gMTkyMikgJT4lIHNlbGVjdChYMTpYMjkpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCkRpZW1DSy4xOTIzIDwtIERpZW1DSyAlPiUgZmlsdGVyKE1BREUgPT0gMTkyMykgJT4lIHNlbGVjdChYMTpYMjkpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCkRpZW1DSy4xOTI0IDwtIERpZW1DSyAlPiUgZmlsdGVyKE1BREUgPT0gMTkyNCkgJT4lIHNlbGVjdChYMTpYMjkpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCgojQWRkIExlYXJuaW5nIG91dGNvbWUgYXQgdG9wIG9mIGRhdGEgZnJhbWUKRGllbUNLLjE5MjEuTE8gPC0gYXMuZGF0YS5mcmFtZShyYmluZChDS0NEUi4xOTIxLERpZW1DSy4xOTIxKSkKRGllbUNLLjE5MjIuTE8gPC0gYXMuZGF0YS5mcmFtZShyYmluZChDS0NEUi4xOTIyLERpZW1DSy4xOTIyKSkKRGllbUNLLjE5MjMuTE8gPC0gYXMuZGF0YS5mcmFtZShyYmluZChDS0NEUi4xOTIzLERpZW1DSy4xOTIzKSkKRGllbUNLLjE5MjQuTE8gPC0gYXMuZGF0YS5mcmFtZShyYmluZChDS0NEUi4xOTI0LERpZW1DSy4xOTI0KSkKCiNMZWFybmluZyBvdXRjb21lIG5hbWUgaW4gZmluYWwgZXhhbQpuYW1lcyh0YWJsZShDS0NEUi4xOTIxKSkKCiMxOTIxCiNTIFBoYW4gbG9haSB0aGVvIGNhYyBjaHVhbiBkYXUgcmEKRGllbUNLLjE5MjEuTE8xMiA8LSBEaWVtQ0suMTkyMS5MT1stMSxEaWVtQ0suMTkyMS5MT1sxLF0gPT0gMTJdCkRpZW1DSy4xOTIxLkxPMjMgPC0gRGllbUNLLjE5MjEuTE9bLTEsRGllbUNLLjE5MjEuTE9bMSxdID09IDIzXQpEaWVtQ0suMTkyMS5MTzMxIDwtIERpZW1DSy4xOTIxLkxPWy0xLERpZW1DSy4xOTIxLkxPWzEsXSA9PSAzMV0KRGllbUNLLjE5MjEuTE8zMiA8LSBEaWVtQ0suMTkyMS5MT1stMSxEaWVtQ0suMTkyMS5MT1sxLF0gPT0gMzJdCgojIENvbmcgdG9uZyB0aGVvIGRvbmcgY3VhIGRhdGFmcmFtZSB2YSB0aGVtIFRvbmcgbW9pIHZhbyB0cm9uZyBkYXRhCkRpZW1DSy4xOTIxLkxPMTIgPC10YWJsZShhcHBseShEaWVtQ0suMTkyMS5MTzEyLCAxLCBzdW0pKQpEaWVtQ0suMTkyMS5MTzIzIDwtdGFibGUoYXBwbHkoRGllbUNLLjE5MjEuTE8yMywgMSwgc3VtKSkKRGllbUNLLjE5MjEuTE8zMSA8LXRhYmxlKGFwcGx5KERpZW1DSy4xOTIxLkxPMzEsIDEsIHN1bSkpCkRpZW1DSy4xOTIxLkxPMzIgPC10YWJsZShhcHBseShEaWVtQ0suMTkyMS5MTzMyLCAxLCBzdW0pKQoKIzE5MjIKI1NvcnRpbmcgYW5zd2VyIGludG8gbGVhcm5pbmcgb3V0Y29tZSBncm91cAoKCkRpZW1DSy4xOTIyLkxPMTIgPC0gRGllbUNLLjE5MjIuTE9bLTEsRGllbUNLLjE5MjIuTE9bMSxdID09IDEyXQpEaWVtQ0suMTkyMi5MTzIzIDwtIERpZW1DSy4xOTIyLkxPWy0xLERpZW1DSy4xOTIyLkxPWzEsXSA9PSAyM10KRGllbUNLLjE5MjIuTE8zMSA8LSBEaWVtQ0suMTkyMi5MT1stMSxEaWVtQ0suMTkyMi5MT1sxLF0gPT0gMzFdCkRpZW1DSy4xOTIyLkxPMzIgPC0gRGllbUNLLjE5MjIuTE9bLTEsRGllbUNLLjE5MjIuTE9bMSxdID09IDMyXQoKI1N1bSByb3cgZGF0YSBmcmFtZSBhbmQgbWFwIHN1bSByZXN1bHQgaW50byBpbnN0YW5jZSBncm91cAoKRGllbUNLLjE5MjIuTE8xMiA8LXRhYmxlKGFwcGx5KERpZW1DSy4xOTIyLkxPMTIsIDEsIHN1bSkpCkRpZW1DSy4xOTIyLkxPMjMgPC10YWJsZShhcHBseShEaWVtQ0suMTkyMi5MTzIzLCAxLCBzdW0pKQpEaWVtQ0suMTkyMi5MTzMxIDwtdGFibGUoYXBwbHkoRGllbUNLLjE5MjIuTE8zMSwgMSwgc3VtKSkKRGllbUNLLjE5MjIuTE8zMiA8LXRhYmxlKGFwcGx5KERpZW1DSy4xOTIyLkxPMzIsIDEsIHN1bSkpCgojMTkyMwojU29ydGluZyBhbnN3ZXIgaW50byBsZWFybmluZyBvdXRjb21lIGdyb3VwCgoKRGllbUNLLjE5MjMuTE8xMiA8LSBEaWVtQ0suMTkyMy5MT1stMSxEaWVtQ0suMTkyMy5MT1sxLF0gPT0gMTJdCkRpZW1DSy4xOTIzLkxPMjMgPC0gRGllbUNLLjE5MjMuTE9bLTEsRGllbUNLLjE5MjMuTE9bMSxdID09IDIzXQpEaWVtQ0suMTkyMy5MTzMxIDwtIERpZW1DSy4xOTIzLkxPWy0xLERpZW1DSy4xOTIzLkxPWzEsXSA9PSAzMV0KRGllbUNLLjE5MjMuTE8zMiA8LSBEaWVtQ0suMTkyMy5MT1stMSxEaWVtQ0suMTkyMy5MT1sxLF0gPT0gMzJdCgojU3VtIHJvdyBkYXRhIGZyYW1lIGFuZCBtYXAgc3VtIHJlc3VsdCBpbnRvIGluc3RhbmNlIGdyb3VwCgpEaWVtQ0suMTkyMy5MTzEyIDwtdGFibGUoYXBwbHkoRGllbUNLLjE5MjMuTE8xMiwgMSwgc3VtKSkKRGllbUNLLjE5MjMuTE8yMyA8LXRhYmxlKGFwcGx5KERpZW1DSy4xOTIzLkxPMjMsIDEsIHN1bSkpCkRpZW1DSy4xOTIzLkxPMzEgPC10YWJsZShhcHBseShEaWVtQ0suMTkyMy5MTzMxLCAxLCBzdW0pKQpEaWVtQ0suMTkyMy5MTzMyIDwtdGFibGUoYXBwbHkoRGllbUNLLjE5MjMuTE8zMiwgMSwgc3VtKSkKCiMxOTI0CiNTb3J0aW5nIGFuc3dlciBpbnRvIGxlYXJuaW5nIG91dGNvbWUgZ3JvdXAKCgpEaWVtQ0suMTkyNC5MTzEyIDwtIERpZW1DSy4xOTI0LkxPWy0xLERpZW1DSy4xOTI0LkxPWzEsXSA9PSAxMl0KRGllbUNLLjE5MjQuTE8yMyA8LSBEaWVtQ0suMTkyNC5MT1stMSxEaWVtQ0suMTkyNC5MT1sxLF0gPT0gMjNdCkRpZW1DSy4xOTI0LkxPMzEgPC0gRGllbUNLLjE5MjQuTE9bLTEsRGllbUNLLjE5MjQuTE9bMSxdID09IDMxXQpEaWVtQ0suMTkyNC5MTzMyIDwtIERpZW1DSy4xOTI0LkxPWy0xLERpZW1DSy4xOTI0LkxPWzEsXSA9PSAzMl0KCiNTdW0gcm93IGRhdGEgZnJhbWUgYW5kIG1hcCBzdW0gcmVzdWx0IGludG8gaW5zdGFuY2UgZ3JvdXAKCkRpZW1DSy4xOTI0LkxPMTIgPC10YWJsZShhcHBseShEaWVtQ0suMTkyNC5MTzEyLCAxLCBzdW0pKQpEaWVtQ0suMTkyNC5MTzIzIDwtdGFibGUoYXBwbHkoRGllbUNLLjE5MjQuTE8yMywgMSwgc3VtKSkKRGllbUNLLjE5MjQuTE8zMSA8LXRhYmxlKGFwcGx5KERpZW1DSy4xOTI0LkxPMzEsIDEsIHN1bSkpCkRpZW1DSy4xOTI0LkxPMzIgPC10YWJsZShhcHBseShEaWVtQ0suMTkyNC5MTzMyLCAxLCBzdW0pKQoKI0xlYXJuaW5nIG91dGNvbWUgMTIKTE9SLkNLMTIgPC0gYXMuZGF0YS5mcmFtZShiaW5kX3Jvd3MoRGllbUNLLjE5MjEuTE8xMixEaWVtQ0suMTkyMi5MTzEyLERpZW1DSy4xOTIzLkxPMTIsRGllbUNLLjE5MjQuTE8xMikpCgojIFRoYXkgY2FjIGdpYSB0cmkgTi9BIHRoYW5oIDAKTE9SLkNLMTJbaXMubmEoTE9SLkNLMTIpXSA8LSAwCiMgQ29uZyBjb3QKTE9SLkNLMTIgPC0gYXMuZGF0YS5mcmFtZShhcHBseShMT1IuQ0sxMiwyLHN1bSkpCgojIFNhcCB4ZXAgbGFpIGRhdGEKTE9SLkNLMTIkU29DYXVUTER1bmcgPC0gcm93Lm5hbWVzKExPUi5DSzEyKQoKI0xlYXJuaW5nIG91dGNvbWUgMjMgKG1lcmdlIGludG8gdXNhYmxlIGRhdGEgZnJhbWUpCgpMT1IuQ0syMyA8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyhEaWVtQ0suMTkyMS5MTzIzLERpZW1DSy4xOTIyLkxPMjMsRGllbUNLLjE5MjMuTE8yMyxEaWVtQ0suMTkyNC5MTzIzKSkKCiNGaWxsIE4vQSBjZWxsIHdpdGggMApMT1IuQ0syM1tpcy5uYShMT1IuQ0syMyldIDwtIDAKI1N1bSBjb2x1bW4KTE9SLkNLMjMgPC0gYXMuZGF0YS5mcmFtZShhcHBseShMT1IuQ0syMywyLHN1bSkpCgpMT1IuQ0syMyRTb0NhdVRMRHVuZyA8LSByb3cubmFtZXMoTE9SLkNLMjMpCgojTGVhcm5pbmcgb3V0Y29tZSAzMSAobWVyZ2UgaW50byB1c2FibGUgZGF0YSBmcmFtZSkKCkxPUi5DSzMxIDwtIGFzLmRhdGEuZnJhbWUoYmluZF9yb3dzKERpZW1DSy4xOTIxLkxPMzEsRGllbUNLLjE5MjIuTE8zMSxEaWVtQ0suMTkyMy5MTzMxLERpZW1DSy4xOTI0LkxPMzEpKQoKI0ZpbGwgTi9BIGNlbGwgd2l0aCAwCkxPUi5DSzMxW2lzLm5hKExPUi5DSzMxKV0gPC0gMAojU3VtIGNvbHVtbgpMT1IuQ0szMSA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KExPUi5DSzMxLDIsc3VtKSkKCkxPUi5DSzMxJFNvQ2F1VExEdW5nIDwtIHJvdy5uYW1lcyhMT1IuQ0szMSkKTE9SLkNLMzEKCiNMZWFybmluZyBvdXRjb21lIDMyIChtZXJnZSBpbnRvIHVzYWJsZSBkYXRhIGZyYW1lKQpMT1IuQ0szMiA8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyhEaWVtQ0suMTkyMS5MTzMyLERpZW1DSy4xOTIyLkxPMzIsRGllbUNLLjE5MjMuTE8zMixEaWVtQ0suMTkyNC5MTzMyKSkKCiNGaWxsIE4vQSBjZWxsIHdpdGggMApMT1IuQ0szMltpcy5uYShMT1IuQ0szMildIDwtIDAKI1N1bSBjb2x1bW4KTE9SLkNLMzIgPC0gYXMuZGF0YS5mcmFtZShhcHBseShMT1IuQ0szMiwyLHN1bSkpCgpMT1IuQ0szMiRTb0NhdVRMRHVuZyA8LSByb3cubmFtZXMoTE9SLkNLMzIpCgojR3JhcGggLS0tLQpHTE9SLkNLMTIgPC1nZ3Bsb3QoTE9SLkNLMTIsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPUi5DSzEyWywyXSksIHkgPSBMT1IuQ0sxMlssMV0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9SLkNLMTJbLDFdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDEyIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBkdW5nIiwgeSA9ICJTbyBzaW5oIHZpZW4iKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjNTdkNWM1IikpCgpHTE9SLkNLMjMgPC0gZ2dwbG90KExPUi5DSzIzLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1IuQ0syM1ssMl0pLCB5ID0gTE9SLkNLMjNbLDFdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPUi5DSzIzWywxXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAyMyIsIHggPSAiU28gY2F1IHRyYSBsb2kgZHVuZyIsIHkgPSAiU28gc2luaCB2aWVuIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzU3ZDVjNSIpKQoKR0xPUi5DSzMxIDwtZ2dwbG90KExPUi5DSzMxLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1IuQ0szMVssMl0pLCB5ID0gTE9SLkNLMzFbLDFdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPUi5DSzMxWywxXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAzMSIsIHggPSAiU28gY2F1IHRyYSBsb2kgZHVuZyIsIHkgPSAiU28gc2luaCB2aWVuIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzU3ZDVjNSIpKQoKR0xPUi5DSzMyIDwtIGdncGxvdChMT1IuQ0szMiwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9SLkNLMzJbLDJdKSwgeSA9IExPUi5DSzMyWywxXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1IuQ0szMlssMV0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMzIiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIGR1bmciLCB5ID0gIlNvIHNpbmggdmllbiIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM1N2Q1YzUiKSkKCkdMT1IuQ0sgPC1nZ2FycmFuZ2UoR0xPUi5DSzEyLEdMT1IuQ0syMyxHTE9SLkNLMzEsR0xPUi5DSzMyLCBuY29sID0gMiwgbnJvdyA9IDIpCkdMT1IuQ0sKZ2dzYXZlKCJoaW5oLzU0NTJfYmlldWRvb3V0Y29tZV9jay5qcGciLCBHTE9SLkNLKQpgYGAKYGBge3J9CiMgQ2F1IElWLjcKIyBEYXRhIGNobyBDaHVhbiBkYXUgcmEgR2l1YSBreSB2YSBDdW9pIGt5CkxPLmRhdGE8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyh0YWJsZShHS0NEUi4xOTIxKSx0YWJsZShDS0NEUi4xOTIxKSkpCiMgQ2h1dXllbiBkb2kgdGhhbmggZGF0YSBkdW5nIGRlIHZlIGJpZXUgZG8KTE8uZGF0YVtpcy5uYShMTy5kYXRhKV0gPC0gMApMTy5kYXRhPC0gYXMuZGF0YS5mcmFtZShhcHBseShMTy5kYXRhLDIsc3VtKSkKTE8uZGF0YSRMTyA8LSByb3cubmFtZXMoTE8uZGF0YSkKTE8uZGF0YQoKIyBEbyB0aGkgCkdMTy5kYXRhIDwtIGdncGxvdChMTy5kYXRhLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMTy5kYXRhWywyXSksIHkgPSBMTy5kYXRhWywxXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MTy5kYXRhWywxXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiUXVlc3Rpb24gcGVyIGxlYXJuaW5nIG91dGNvbWUiLCB4ID0gIkxlYXJuaW5nIG91dGNvbWUiLCB5ID0gIlF1ZXN0aW9ucyBxdWFudGl0eSIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM1N2Q1YzUiKSkKR0xPLmRhdGEKCmdnc2F2ZSgiaGluaC81NDcxX2JpZXVkb2NhdWhvaS5qcGciLCBHTE8uZGF0YSkKCiMKVG90YWxRRnJhbWVDSzwtYXMuZGF0YS5mcmFtZSh0YWJsZShhcy5udW1lcmljKENLQ0RSWzEsLTFdKSkpCgpUb3RhbFFGcmFtZUdLPC1hcy5kYXRhLmZyYW1lKHRhYmxlKGFzLm51bWVyaWMoR0tDRFJbMSwtMV0pKSkKClRvdGFsUUZyYW1lR0tFWDwtYXMuZGF0YS5mcmFtZShiaW5kX3Jvd3ModGFibGUoR0tDRFIuMTkyMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUoR0tDRFIuMTkyMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUoR0tDRFIuMTkyMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUoR0tDRFIuMTkyNCkpKQpUb3RhbFFGcmFtZUdLRVhbaXMubmEoVG90YWxRRnJhbWVHS0VYKV0gPC0gMAojZXhjZXB0aW9uIGZvciAxOTIyIExPIDIzICYgMTIKVG90YWxRRnJhbWVHS0VYCmBgYAoKYGBge3IgZmlnLmhlaWdodCA9IDUwLCBmaWcud2lkdGggPSA1MH0KIyBDYXUgSVYuOAojY29udmVydCBkYXRhIGZyb20gcHJvYmxlbSA2IGZvciByZXVzZQoKTE9XLkdLMTEgPC0gTE9SLkdLMTEKTE9XLkdLMTEgPC0gdHJhbnNmb3JtKExPVy5HSzExLCBTb0NhdVRMRHVuZyA9IGFzLm51bWVyaWMoU29DYXVUTER1bmcpKQpMT1cuR0sxMSRTb0NhdVRMU2FpIDwtIGFicyhMT1cuR0sxMSRTb0NhdVRMRHVuZyAtIGFzLm51bWVyaWMoVG90YWxRRnJhbWVHS1sxLDJdKSkKTE9XLkdLMTEgPC0gTE9XLkdLMTFbLGMoMSwzKV0KCiNwZXJjZW50YWdpbmcKTE9XLkdLMTEkcGVyY2VudCA8LSByb3VuZChMT1cuR0sxMVssMV0vc3VtKExPVy5HSzExWywxXSksMykKTE9XLkdLMTEKCiNleGNlcHRpb24gaGFuZGxpbmcgZm9yIExlYXJuaW5nIG91dGNvbWUgMTIgCgoKTE9XLkdLMTIuMTkyMS4zLjQ8LSBhcy5kYXRhLmZyYW1lKGJpbmRfcm93cyhEaWVtR0suMTkyMS5MTzEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZW1HSy4xOTIzLkxPMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGllbUdLLjE5MjQuTE8xMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQojZmlsbCBuYSB3aXRoIDAKTE9XLkdLMTIuMTkyMS4zLjRbaXMubmEoTE9XLkdLMTIuMTkyMS4zLjQpXSA8LSAwCgpMT1cuR0sxMi4xOTIxLjMuNDwtIGFzLmRhdGEuZnJhbWUoYXBwbHkoTE9XLkdLMTIuMTkyMS4zLjQsMixzdW0pKQpMT1cuR0sxMi4xOTIxLjMuNCRTb0NhdVRMU2FpIDwtIGFicyhhcy5udW1lcmljKHJvdy5uYW1lcyhMT1cuR0sxMi4xOTIxLjMuNCkpIC0gMTIpCgojcGVyY2VudGFnaW5nCkxPVy5HSzEyLjE5MjEuMy40JHBlcmNlbnQgPC1yb3VuZChMT1cuR0sxMi4xOTIxLjMuNFssMV0vc3VtKExPVy5HSzEyLjE5MjEuMy40WywxXSksMykKCkxPVy5HSzEyLjE5MjI8LXQoYXMuZGF0YS5mcmFtZShiaW5kX3Jvd3MoRGllbUdLLjE5MjIuTE8xMikpKQoKdGVtcDE5MjIgPC0gYWJzKGFzLm51bWVyaWMocm93Lm5hbWVzKExPVy5HSzEyLjE5MjIpKSAtIDExKQoKTE9XLkdLMTIuMTkyMjwtYXMuZGF0YS5mcmFtZShEaWVtR0suMTkyMi5MTzEyKQpMT1cuR0sxMi4xOTIyJFNvQ2F1VExTYWkgPC0gYXMubnVtZXJpYyh0ZW1wMTkyMikKCkxPVy5HSzEyLjE5MjIkcGVyY2VudCA8LSByb3VuZChMT1cuR0sxMi4xOTIyWywyXS9zdW0oTE9XLkdLMTIuMTkyMlssMl0pLDMpCkxPVy5HSzEyLjE5MjI8LSBMT1cuR0sxMi4xOTIyWyxjKDMsNCldCgojcmVzZXJ2ZQoKRGllbUdLLjE5MjEuTE8xMi5tb2QgPC0gRGllbUdLLjE5MjEuTE8xMgpEaWVtR0suMTkyMi5MTzEyLm1vZCA8LSBEaWVtR0suMTkyMi5MTzEyCkRpZW1HSy4xOTIzLkxPMTIubW9kIDwtIERpZW1HSy4xOTIzLkxPMTIKRGllbUdLLjE5MjQuTE8xMi5tb2QgPC0gRGllbUdLLjE5MjQuTE8xMgoKcm93bmFtZXMoRGllbUdLLjE5MjEuTE8xMi5tb2QpPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoRGllbUdLLjE5MjEuTE8xMikpIC0xMikKcm93bmFtZXMoRGllbUdLLjE5MjIuTE8xMi5tb2QpPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoRGllbUdLLjE5MjIuTE8xMikpIC0xMSkKcm93bmFtZXMoRGllbUdLLjE5MjMuTE8xMi5tb2QpPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoRGllbUdLLjE5MjMuTE8xMikpIC0xMikKcm93bmFtZXMoRGllbUdLLjE5MjQuTE8xMi5tb2QpPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoRGllbUdLLjE5MjQuTE8xMikpIC0xMikKCkxPVy5HSzEyIDwtIGFzLmRhdGEuZnJhbWUoYmluZF9yb3dzKERpZW1HSy4xOTIxLkxPMTIubW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWVtR0suMTkyMi5MTzEyLm1vZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGllbUdLLjE5MjMuTE8xMi5tb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZW1HSy4xOTI0LkxPMTIubW9kLAopKQoKTE9XLkdLMTJbaXMubmEoTE9XLkdLMTIpXSA8LSAwCmFzLm51bWVyaWMocm93Lm5hbWVzKERpZW1HSy4xOTIxLkxPMTIpKSAtMQpMT1cuR0sxMjwtYXMuZGF0YS5mcmFtZShhcHBseShMT1cuR0sxMiwyLHN1bSkpCkxPVy5HSzEyCkxPVy5HSzEyJFNvQ2F1VExTYWkgPC0gYWJzKGFzLm51bWVyaWMocm93Lm5hbWVzKExPVy5HSzEyKSkpCkxPVy5HSzEyJHBlcmNlbnQgPC0gcm91bmQoTE9XLkdLMTJbLDFdL3N1bShMT1cuR0sxMlssMV0pLDMpCkxPVy5HSzEyCgoKTE9XLkdLMjEgPC0gTE9SLkdLMjEKTE9XLkdLMjEgPC0gdHJhbnNmb3JtKExPVy5HSzIxLCBTb0NhdVRMRHVuZyA9IGFzLm51bWVyaWMoU29DYXVUTER1bmcpKQpMT1cuR0syMSRTb0NhdVRMU2FpIDwtIGFicyhMT1cuR0syMSRTb0NhdVRMRHVuZyAtIGFzLm51bWVyaWMoVG90YWxRRnJhbWVHS1szLDJdKSkKTE9XLkdLMjEgPC0gTE9XLkdLMjFbLGMoMSwzKV0KTE9XLkdLMjEKI3BlcmNlbnRhZ2luZwpMT1cuR0syMSRwZXJjZW50IDwtIHJvdW5kKExPVy5HSzIxWywxXS9zdW0oTE9XLkdLMjFbLDFdKSwzKQpMT1cuR0syMQoKCkxPVy5HSzIyIDwtIExPUi5HSzIyCkxPVy5HSzIyIDwtIHRyYW5zZm9ybShMT1cuR0syMiwgU29DYXVUTER1bmcgPSBhcy5udW1lcmljKFNvQ2F1VExEdW5nKSkKTE9XLkdLMjIkU29DYXVUTFNhaSA8LSBhYnMoTE9XLkdLMjIkU29DYXVUTER1bmcgLSBhcy5udW1lcmljKFRvdGFsUUZyYW1lR0tbNCwyXSkpCkxPVy5HSzIyIDwtIExPVy5HSzIyWyxjKDEsMyldCgojcGVyY2VudGFnaW5nCkxPVy5HSzIyJHBlcmNlbnQgPC0gcm91bmQoTE9XLkdLMjJbLDFdL3N1bShMT1cuR0syMlssMV0pLDMpCkxPVy5HSzIyCgpMT1cuR0szMSA8LSBMT1IuR0szMQpMT1cuR0szMSA8LSB0cmFuc2Zvcm0oTE9XLkdLMzEsIFNvQ2F1VExEdW5nID0gYXMubnVtZXJpYyhTb0NhdVRMRHVuZykpCkxPVy5HSzMxJFNvQ2F1VExTYWkgPC0gYWJzKExPVy5HSzMxJFNvQ2F1VExEdW5nIC0gYXMubnVtZXJpYyhUb3RhbFFGcmFtZUdLWzUsMl0pKQpMT1cuR0szMSA8LSBMT1cuR0szMVssYygxLDMpXQoKI3BlcmNlbnRhZ2luZwpMT1cuR0szMSRwZXJjZW50IDwtIHJvdW5kKExPVy5HSzMxWywxXS9zdW0oTE9XLkdLMzFbLDFdKSwzKQpMT1cuR0szMQoKI2V4Y2VwdGlvbiBmb3IgMTkyMiBjb2RlCkxPVy5HSzIzIDwtIExPUi5HSzIzCkxPVy5HSzIzIDwtIHRyYW5zZm9ybShMT1cuR0syMywgU29DYXVUcmFMb2lEdW5nID0gYXMubnVtZXJpYyhTb0NhdVRyYUxvaUR1bmcpKQpMT1cuR0syMyRTb0NhdVRMU2FpIDwtIGFicyhhcy5udW1lcmljKExPVy5HSzIzJFNvQ2F1VHJhTG9pRHVuZykgLSAyKQpMT1cuR0syMyA8LSBMT1cuR0syM1ssYygyLDQpXQoKI3BlcmNlbnRhZ2luZwpMT1cuR0syMyRwZXJjZW50IDwtIHJvdW5kKExPVy5HSzIzWywxXS9zdW0oTE9XLkdLMjNbLDFdKSwzKQpMT1cuR0syMwoKI0dyYXBoIC0tLQoKR0xPVy5HSzExIDwtIGdncGxvdChMT1cuR0sxMSwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9XLkdLMTFbLDJdKSwgeSA9IExPVy5HSzExWywzXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1cuR0sxMVssM10pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMTEiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9XLkdLMTIgPC0gIGdncGxvdChMT1cuR0sxMiwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9XLkdLMTJbLDJdKSwgeSA9IExPVy5HSzEyWywzXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1cuR0sxMlssM10pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMTIiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9XLkdLMjEgPC0gZ2dwbG90KExPVy5HSzIxLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1cuR0syMVssMl0pLCB5ID0gTE9XLkdLMjFbLDNdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPVy5HSzIxWywzXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAyMSIsIHggPSAiU28gY2F1IHRyYSBsb2kgc2FpIiwgeSA9ICJ0YW4gc3VhdCB0dW9uZyBkdW9uZyIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1cuR0syMiA8LSAgZ2dwbG90KExPVy5HSzIyLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1cuR0syMlssMl0pLCB5ID0gTE9XLkdLMjJbLDNdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPVy5HSzIyWywzXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAyMiIsIHggPSAiU28gY2F1IHRyYSBsb2kgc2FpIiwgeSA9ICJ0YW4gc3VhdCB0dW9uZyBkdW9uZyIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1cuR0szMSA8LSBnZ3Bsb3QoTE9XLkdLMzEsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPVy5HSzMxWywyXSksIHkgPSBMT1cuR0szMVssM10pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9XLkdLMzFbLDNdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDMxIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBzYWkiLCB5ID0gInRhbiBzdWF0IHR1b25nIGR1b25nIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Q1NTdkNSIpKQoKR0xPVy5HSzIzIDwtIGdncGxvdChMT1cuR0syMywgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9XLkdLMjNbLDJdKSwgeSA9IExPVy5HSzIzWywzXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1cuR0syM1ssM10pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMzEiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9XLkdLMTIuMS4zLjQgPC0gZ2dwbG90KExPVy5HSzEyLjE5MjEuMy40LCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1cuR0sxMi4xOTIxLjMuNFssMl0pLCB5ID0gTE9XLkdLMTIuMTkyMS4zLjRbLDNdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPVy5HSzEyLjE5MjEuMy40WywzXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAxMi0xOTIxLTMtNCIsIHggPSAiU28gY2F1IHRyYSBsb2kgc2FpIiwgeSA9ICJ0YW4gc3VhdCB0dW9uZyBkdW9uZyIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1cuR0sxMi4yIDwtIGdncGxvdChMT1cuR0sxMi4xOTIyLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1cuR0sxMi4xOTIyWywxXSksIHkgPSBMT1cuR0sxMi4xOTIyWywyXSkpICsgZ2VvbV9iYXIoc3RhdCA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPVy5HSzEyLjE5MjJbLDJdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDEyLTE5MjIiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgoKR0xPVy5HSyA8LWdnYXJyYW5nZShHTE9XLkdLMTEsR0xPVy5HSzEyLjIsR0xPVy5HSzEyLjEuMy40LEdMT1cuR0sxMixHTE9XLkdLMjEsR0xPVy5HSzIyLEdMT1cuR0syMyxHTE9XLkdLMzEsIG5jb2wgPSAzLCBucm93ID0gMykKR0xPVy5HSwojIGdnc2F2ZSgiaGluaC81NDgxX2JpZXVkb3RhbnN1YXRjYXVzYWlnay5qcGciLCBHTE9XLkdLKQpgYGAKCmBgYHtyfQojIENhdSBJVi45CiNjb252ZXJ0IGRhdGEgZnJvbSBwcm9ibGVtIDYgZm9yIHJldXNlCgpMT1cuQ0sxMiA8LSBMT1IuQ0sxMgpMT1cuQ0sxMiA8LSB0cmFuc2Zvcm0oTE9XLkNLMTIsIFNvQ2F1VExEdW5nID0gYXMubnVtZXJpYyhTb0NhdVRMRHVuZykpCkxPVy5DSzEyJFNvQ2F1VExTYWkgPC0gYWJzKExPVy5DSzEyJFNvQ2F1VExEdW5nIC0gYXMubnVtZXJpYyhUb3RhbFFGcmFtZUNLWzEsMl0pKQpMT1cuQ0sxMiA8LSBMT1cuQ0sxMlssYygxLDMpXQoKI3BlcmNlbnRhZ2luZwpMT1cuQ0sxMiRwZXJjZW50IDwtIHJvdW5kKExPVy5DSzEyWywxXS9zdW0oTE9XLkNLMTJbLDFdKSwzKQpMT1cuQ0sxMgoKTE9XLkNLMjMgPC0gTE9SLkNLMjMKTE9XLkNLMjMgPC0gdHJhbnNmb3JtKExPVy5DSzIzLCBTb0NhdVRMRHVuZyA9IGFzLm51bWVyaWMoU29DYXVUTER1bmcpKQpMT1cuQ0syMyRTb0NhdVRMU2FpIDwtIGFicyhMT1cuQ0syMyRTb0NhdVRMRHVuZyAtIGFzLm51bWVyaWMoVG90YWxRRnJhbWVDS1syLDJdKSkKTE9XLkNLMjMgPC0gTE9XLkNLMjNbLGMoMSwzKV0KCiNwZXJjZW50YWdpbmcKTE9XLkNLMjMkcGVyY2VudCA8LSByb3VuZChMT1cuQ0syM1ssMV0vc3VtKExPVy5DSzIzWywxXSksMykKTE9XLkNLMjMKCkxPVy5DSzMxIDwtIExPUi5DSzMxCkxPVy5DSzMxIDwtIHRyYW5zZm9ybShMT1cuQ0szMSwgU29DYXVUTER1bmcgPSBhcy5udW1lcmljKFNvQ2F1VExEdW5nKSkKTE9XLkNLMzEkU29DYXVUTFNhaSA8LSBhYnMoTE9XLkNLMzEkU29DYXVUTER1bmcgLSBhcy5udW1lcmljKFRvdGFsUUZyYW1lQ0tbMywyXSkpCkxPVy5DSzMxIDwtIExPVy5DSzMxWyxjKDEsMyldCgojcGVyY2VudGFnaW5nCkxPVy5DSzMxJHBlcmNlbnQgPC0gcm91bmQoTE9XLkNLMzFbLDFdL3N1bShMT1cuQ0szMVssMV0pLDMpCkxPVy5DSzMxCgpMT1cuQ0szMiA8LSBMT1IuQ0szMgpMT1cuQ0szMiA8LSB0cmFuc2Zvcm0oTE9XLkNLMzIsIFNvQ2F1VExEdW5nID0gYXMubnVtZXJpYyhTb0NhdVRMRHVuZykpCkxPVy5DSzMyJFNvQ2F1VExTYWkgPC0gYWJzKExPVy5DSzMyJFNvQ2F1VExEdW5nIC0gYXMubnVtZXJpYyhUb3RhbFFGcmFtZUNLWzQsMl0pKQpMT1cuQ0szMiA8LSBMT1cuQ0szMlssYygxLDMpXQoKI3BlcmNlbnRhZ2luZwpMT1cuQ0szMiRwZXJjZW50IDwtIHJvdW5kKExPVy5DSzMyWywxXS9zdW0oTE9XLkNLMzJbLDFdKSwzKQpMT1cuQ0szMgoKI0dyYXBoLS0tCgpHTE9XLkNLMTIgPC0gZ2dwbG90KExPVy5DSzEyLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1cuQ0sxMlssMl0pLCB5ID0gTE9XLkNLMTJbLDNdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPVy5DSzEyWywzXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAxMiIsIHggPSAiU28gY2F1IHRyYSBsb2kgc2FpIiwgeSA9ICJ0YW4gc3VhdCB0dW9uZyBkdW9uZyIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1cuQ0syMyA8LSBnZ3Bsb3QoTE9XLkNLMjMsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPVy5DSzIzWywyXSksIHkgPSBMT1cuQ0syM1ssM10pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9XLkNLMjNbLDNdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDIzIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBzYWkiLCB5ID0gInRhbiBzdWF0IHR1b25nIGR1b25nIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Q1NTdkNSIpKQoKR0xPVy5DSzMxIDwtIGdncGxvdChMT1cuQ0szMSwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9XLkNLMzFbLDJdKSwgeSA9IExPVy5DSzMxWywzXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1cuQ0szMVssM10pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMzEiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTE9XLkNLMzIgPC0gZ2dwbG90KExPVy5DSzMyLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihMT1cuQ0szMlssMl0pLCB5ID0gTE9XLkNLMzJbLDNdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUxPVy5DSzMyWywzXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTGVhcm5pbmcgT3V0Y29tZSAzMiIsIHggPSAiU28gY2F1IHRyYSBsb2kgc2FpIiwgeSA9ICJ0YW4gc3VhdCB0dW9uZyBkdW9uZyIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdMT1cuQ0sgPC1nZ2FycmFuZ2UoR0xPVy5DSzEyLEdMT1cuQ0syMyxHTE9XLkNLMzEsR0xPVy5DSzMyLCBuY29sID0gMywgbnJvdyA9IDIpCgpHTE9XLkNLCmBgYAoKYGBge3IgZmlnLmhlaWdodCA9IDUwLCBmaWcud2lkdGggPSA3NX0KIyBDYXUgSVYuMTAKTG9MaXN0Q0sgPC0gZGF0YS5mcmFtZShMTz0gbmFtZXModGFibGUoQ0tDRFIuMTkyMikpKQpMb0xpc3RHSyA8LSBkYXRhLmZyYW1lKExPPSBuYW1lcyh0YWJsZShHS0NEUi4xOTIyKSkpCkxvQXA8LWFzLmRhdGEuZnJhbWUodGFibGUocmJpbmQoTG9MaXN0Q0ssTG9MaXN0R0spKSkKCiNMbyBhcHBlYXJlZCBpbiBib3RoIG1pZHRlcm0gYW5kIGZpbmFsCkxvQXBbTG9BcCRGcmVxID09IDIsXQpUb3RhbFFGcmFtZUNLW1RvdGFsUUZyYW1lQ0skVmFyMSA9PSAxMixdClRvdGFsUUZyYW1lR0tbVG90YWxRRnJhbWVHSyRWYXIxID09IDEyLF0KCiNOdW1iZXIgb2Ygc3R1ZGVudHMgaW4gbWlkL2ZpbmFsIApucm93KERpZW1HSykKbnJvdyhEaWVtQ0spCiNjcmVhdGUgZGF0YSB3aXRoIDM2MSBzdHVkZW50cyhiYXNlZCBvbiBmaW5hbCkKI3dlIHdpbGwgZGVhbCB3aXRoIDUgbGFzdCBzdHVkZW50cyBsYXRlcgoKRGllbUdLQ0s8LSBjYmluZCggRGllbUdLWzE6MzYxLF0sRGllbUNLKQojTWEgZGUgcG9vbAptZCA8LSBhcy5udW1lcmljKENLQ0RSWywxXSkKI2FkZCBjb21iaW5lZCBtYWRlCkRpZW1HS0NLJG1kQ0tfR0sgPC0gYXMubnVtZXJpYyhwYXN0ZShEaWVtR0tDS1ssMjldICxEaWVtR0tDS1ssNjJdLCBzZXAgPSAiIikpCiNyZWFycmFuZ2UKRGllbUdLQ0sgPC0gRGllbUdLQ0tbLGMoNjMsMSw0OjI4LDMzOjYxKV0KY29sbmFtZXMoRGllbUdLQ0spW2MoMzo1NildIDwtIGMoMTo1NCkKCiNyZW5hbWUgY29sdW1uCkdLQ0RSLmNvbHJlbmFtZSA8LUdLQ0RSCkNLQ0RSLmNvbHJlbmFtZSA8LUNLQ0RSCmNvbG5hbWVzKEdLQ0RSLmNvbHJlbmFtZSlbMjoyNl0gPC0gYygxOjI1KQpjb2xuYW1lcyhDS0NEUi5jb2xyZW5hbWUpWzI6MzBdIDwtIGMoMjY6NTQpCgoKTUQxOTIxLjE5MjEgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSkKTUQxOTIxLjE5MjIgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSkKTUQxOTIxLjE5MjMgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSkKTUQxOTIxLjE5MjQgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSkKTUQxOTIyLjE5MjEgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSkKTUQxOTIyLjE5MjIgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSkKTUQxOTIyLjE5MjMgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSkKTUQxOTIyLjE5MjQgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSkKTUQxOTIzLjE5MjEgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSkKTUQxOTIzLjE5MjIgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSkKTUQxOTIzLjE5MjMgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSkKTUQxOTIzLjE5MjQgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSkKTUQxOTI0LjE5MjEgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIxLC0xXSkKTUQxOTI0LjE5MjIgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIyLC0xXSkKTUQxOTI0LjE5MjMgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTIzLC0xXSkKTUQxOTI0LjE5MjQgPC0gY2JpbmQoR0tDRFIuY29scmVuYW1lW0dLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSwKICAgICAgICAgICAgICAgICAgICAgQ0tDRFIuY29scmVuYW1lW0NLQ0RSLmNvbHJlbmFtZVsxXSA9PSAxOTI0LC0xXSkKCm5jb2woTUQxOTI0LjE5MjQpCgpEaWVtMTkyMS4xOTIxPC1EaWVtR0tDS1tEaWVtR0tDS1sxXSA9PSAxOTIxMTkyMSxdCkRpZW0xOTIxLjE5MjI8LURpZW1HS0NLW0RpZW1HS0NLWzFdID09IDE5MjExOTIyLF0KRGllbTE5MjEuMTkyMzwtRGllbUdLQ0tbRGllbUdLQ0tbMV0gPT0gMTkyMTE5MjMsXQpEaWVtMTkyMS4xOTI0PC1EaWVtR0tDS1tEaWVtR0tDS1sxXSA9PSAxOTIxMTkyNCxdCkRpZW0xOTIyLjE5MjE8LURpZW1HS0NLW0RpZW1HS0NLWzFdID09IDE5MjIxOTIxLF0KRGllbTE5MjIuMTkyMjwtRGllbUdLQ0tbRGllbUdLQ0tbMV0gPT0gMTkyMjE5MjIsXQpEaWVtMTkyMi4xOTIzPC1EaWVtR0tDS1tEaWVtR0tDS1sxXSA9PSAxOTIyMTkyMyxdCkRpZW0xOTIyLjE5MjQ8LURpZW1HS0NLW0RpZW1HS0NLWzFdID09IDE5MjIxOTI0LF0KRGllbTE5MjMuMTkyMTwtRGllbUdLQ0tbRGllbUdLQ0tbMV0gPT0gMTkyMzE5MjEsXQpEaWVtMTkyMy4xOTIyPC1EaWVtR0tDS1tEaWVtR0tDS1sxXSA9PSAxOTIzMTkyMixdCkRpZW0xOTIzLjE5MjM8LURpZW1HS0NLW0RpZW1HS0NLWzFdID09IDE5MjMxOTIzLF0KRGllbTE5MjMuMTkyNDwtRGllbUdLQ0tbRGllbUdLQ0tbMV0gPT0gMTkyMzE5MjQsXQpEaWVtMTkyNC4xOTIxPC1EaWVtR0tDS1tEaWVtR0tDS1sxXSA9PSAxOTI0MTkyMSxdCkRpZW0xOTI0LjE5MjI8LURpZW1HS0NLW0RpZW1HS0NLWzFdID09IDE5MjQxOTIyLF0KRGllbTE5MjQuMTkyMzwtRGllbUdLQ0tbRGllbUdLQ0tbMV0gPT0gMTkyNDE5MjMsXQpEaWVtMTkyNC4xOTI0PC1EaWVtR0tDS1tEaWVtR0tDS1sxXSA9PSAxOTI0MTkyNCxdCgpEaWVtMTkyMS4xOTIxIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjEuMTkyMSxEaWVtMTkyMS4xOTIxWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMS4xOTIyIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjEuMTkyMixEaWVtMTkyMS4xOTIyWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMS4xOTIzIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjEuMTkyMyxEaWVtMTkyMS4xOTIzWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMS4xOTI0IDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjEuMTkyNCxEaWVtMTkyMS4xOTI0WyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMi4xOTIxIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjIuMTkyMSxEaWVtMTkyMi4xOTIxWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMi4xOTIyIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjIuMTkyMixEaWVtMTkyMi4xOTIyWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMi4xOTIzIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjIuMTkyMyxEaWVtMTkyMi4xOTIzWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMi4xOTI0IDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjIuMTkyNCxEaWVtMTkyMi4xOTI0WyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMy4xOTIxIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjMuMTkyMSxEaWVtMTkyMy4xOTIxWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMy4xOTIyIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjMuMTkyMixEaWVtMTkyMy4xOTIyWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMy4xOTIzIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjMuMTkyMyxEaWVtMTkyMy4xOTIzWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyMy4xOTI0IDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjMuMTkyNCxEaWVtMTkyMy4xOTI0WyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyNC4xOTIxIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjQuMTkyMSxEaWVtMTkyNC4xOTIxWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyNC4xOTIyIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjQuMTkyMixEaWVtMTkyNC4xOTIyWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyNC4xOTIzIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjQuMTkyMyxEaWVtMTkyNC4xOTIzWyxjKDM6NTYpXSksMixhcy5udW1lcmljKQpEaWVtMTkyNC4xOTI0IDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjQuMTkyNCxEaWVtMTkyNC4xOTI0WyxjKDM6NTYpXSksMixhcy5udW1lcmljKQoKI2xhc3QgNSBzdHVkZW50cyBkaWQgbWlkdGVybSBleGFtIGJ1dCBkaWQgbm90IGRvIGZpbmFsIGV4YW0gCmxhc3Q1LjE5MjIgPC0gRGllbUdLWzM2MjozNjYsXQpsYXN0NS4xOTIzIDwtIERpZW1HS1szNjI6MzY2LF0KbGFzdDUuMTkyNCA8LSBEaWVtR0tbMzYyOjM2NixdCmxhc3Q1LjE5MjIgPC0gbGFzdDUuMTkyMiAlPiUgZmlsdGVyKE1BREU9PTE5MjIpICU+JSBzZWxlY3QoWDE6WDI1KSAlPiUgYXBwbHkoMixhcy5udW1lcmljKQpsYXN0NS4xOTIzIDwtIGxhc3Q1LjE5MjMgJT4lIGZpbHRlcihNQURFPT0xOTIzKSAlPiUgc2VsZWN0KFgxOlgyNSkgJT4lIGFwcGx5KDIsYXMubnVtZXJpYykKbGFzdDUuMTkyNCA8LSBsYXN0NS4xOTI0ICU+JSBmaWx0ZXIoTUFERT09MTkyNCkgJT4lIHNlbGVjdChYMTpYMjUpICU+JSBhcHBseSgyLGFzLm51bWVyaWMpCgpsYXN0NS4xOTIyIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoR0tDRFIuMTkyMixsYXN0NS4xOTIyKSkKbGFzdDUuMTkyMyA8LSBhcy5kYXRhLmZyYW1lKHJiaW5kKEdLQ0RSLjE5MjMsbGFzdDUuMTkyMykpCmxhc3Q1LjE5MjQgPC0gYXMuZGF0YS5mcmFtZShyYmluZChHS0NEUi4xOTI0LGxhc3Q1LjE5MjQpKQoKCiNMZWFybmluZyBvdXRjb21lIDEyCgpMTzEyLmxhc3Q1LjE5MjIgPC0gdGFibGUoYXBwbHkobGFzdDUuMTkyMlstMSxsYXN0NS4xOTIyWzEsXT09MTJdLDEsc3VtKSkKTE8xMi5sYXN0NS4xOTIzIDwtIHRhYmxlKGFwcGx5KGxhc3Q1LjE5MjNbLTEsbGFzdDUuMTkyM1sxLF09PTEyXSwxLHN1bSkpCkxPMTIubGFzdDUuMTkyNCA8LSB0YWJsZShhcHBseShsYXN0NS4xOTI0Wy0xLGxhc3Q1LjE5MjRbMSxdPT0xMl0sMSxzdW0pKQoKcm93bmFtZXMoTE8xMi5sYXN0NS4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLmxhc3Q1LjE5MjIpKSAtIG5jb2woR0tDRFJbR0tDRFJbLDFdPT0xOTIyLEdLQ0RSWzIsXSA9PSAxMl0pKQpyb3duYW1lcyhMTzEyLmxhc3Q1LjE5MjMpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMTIubGFzdDUuMTkyMykpIC0gbmNvbChHS0NEUltHS0NEUlssMV09PTE5MjMsR0tDRFJbMixdID09IDEyXSkpCnJvd25hbWVzKExPMTIubGFzdDUuMTkyNCkgPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoTE8xMi5sYXN0NS4xOTI0KSkgLSBuY29sKEdLQ0RSW0dLQ0RSWywxXT09MTkyNCxHS0NEUlsyLF0gPT0gMTJdKSkKCgpMTzEyLkRpZW0xOTIxLjE5MjEgPC0gdGFibGUoYXBwbHkoRGllbTE5MjEuMTkyMVstMSxEaWVtMTkyMS4xOTIxWzEsXT09MTJdLDEsc3VtKSkKTE8xMi5EaWVtMTkyMS4xOTIyIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIxLjE5MjJbLTEsRGllbTE5MjEuMTkyMlsxLF09PTEyXSwxLHN1bSkpCkxPMTIuRGllbTE5MjEuMTkyMyA8LSB0YWJsZShhcHBseShEaWVtMTkyMS4xOTIzWy0xLERpZW0xOTIxLjE5MjNbMSxdPT0xMl0sMSxzdW0pKQpMTzEyLkRpZW0xOTIxLjE5MjQgPC0gdGFibGUoYXBwbHkoRGllbTE5MjEuMTkyNFstMSxEaWVtMTkyMS4xOTI0WzEsXT09MTJdLDEsc3VtKSkKTE8xMi5EaWVtMTkyMi4xOTIxIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIyLjE5MjFbLTEsRGllbTE5MjIuMTkyMVsxLF09PTEyXSwxLHN1bSkpCkxPMTIuRGllbTE5MjIuMTkyMiA8LSB0YWJsZShhcHBseShEaWVtMTkyMi4xOTIyWy0xLERpZW0xOTIyLjE5MjJbMSxdPT0xMl0sMSxzdW0pKQpMTzEyLkRpZW0xOTIyLjE5MjMgPC0gdGFibGUoYXBwbHkoRGllbTE5MjIuMTkyM1stMSxEaWVtMTkyMi4xOTIzWzEsXT09MTJdLDEsc3VtKSkKTE8xMi5EaWVtMTkyMi4xOTI0IDwtIHRhYmxlKGFwcGx5KERpZW0xOTIyLjE5MjRbLTEsRGllbTE5MjIuMTkyNFsxLF09PTEyXSwxLHN1bSkpCkxPMTIuRGllbTE5MjMuMTkyMSA8LSB0YWJsZShhcHBseShEaWVtMTkyMy4xOTIxWy0xLERpZW0xOTIzLjE5MjFbMSxdPT0xMl0sMSxzdW0pKQpMTzEyLkRpZW0xOTIzLjE5MjIgPC0gdGFibGUoYXBwbHkoRGllbTE5MjMuMTkyMlstMSxEaWVtMTkyMy4xOTIyWzEsXT09MTJdLDEsc3VtKSkKTE8xMi5EaWVtMTkyMy4xOTIzIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIzLjE5MjNbLTEsRGllbTE5MjMuMTkyM1sxLF09PTEyXSwxLHN1bSkpCkxPMTIuRGllbTE5MjMuMTkyNCA8LSB0YWJsZShhcHBseShEaWVtMTkyMy4xOTI0Wy0xLERpZW0xOTIzLjE5MjRbMSxdPT0xMl0sMSxzdW0pKQpMTzEyLkRpZW0xOTI0LjE5MjEgPC0gdGFibGUoYXBwbHkoRGllbTE5MjQuMTkyMVstMSxEaWVtMTkyNC4xOTIxWzEsXT09MTJdLDEsc3VtKSkKTE8xMi5EaWVtMTkyNC4xOTIyIDwtIHRhYmxlKGFwcGx5KERpZW0xOTI0LjE5MjJbLTEsRGllbTE5MjQuMTkyMlsxLF09PTEyXSwxLHN1bSkpCkxPMTIuRGllbTE5MjQuMTkyMyA8LSB0YWJsZShhcHBseShEaWVtMTkyNC4xOTIzWy0xLERpZW0xOTI0LjE5MjNbMSxdPT0xMl0sMSxzdW0pKQpMTzEyLkRpZW0xOTI0LjE5MjQgPC0gdGFibGUoYXBwbHkoRGllbTE5MjQuMTkyNFstMSxEaWVtMTkyNC4xOTI0WzEsXT09MTJdLDEsc3VtKSkKCiNtYWtlIGNvdW50IHJpZ2h0IGFuc3dlciAtPiB3cm9uZyBhbnN3ZXIKcm93bmFtZXMoTE8xMi5EaWVtMTkyMS4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIxLjE5MjEpKSAtIG5jb2woTUQxOTIxLjE5MjFbLE1EMTkyMS4xOTIxWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyMS4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIxLjE5MjIpKSAtIG5jb2woTUQxOTIxLjE5MjJbLE1EMTkyMS4xOTIyWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyMS4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIxLjE5MjMpKSAtIG5jb2woTUQxOTIxLjE5MjNbLE1EMTkyMS4xOTIzWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyMS4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIxLjE5MjQpKSAtIG5jb2woTUQxOTIxLjE5MjRbLE1EMTkyMS4xOTI0WzEsXT09MTJdKSkKCiNkaWZmZXJlbnQgaXMgaGVyZQpyb3duYW1lcyhMTzEyLkRpZW0xOTIyLjE5MjEpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMTIuRGllbTE5MjIuMTkyMSkpIC0gbmNvbChNRDE5MjIuMTkyMVssTUQxOTIyLjE5MjFbMSxdPT0xMl0pKQpyb3duYW1lcyhMTzEyLkRpZW0xOTIyLjE5MjIpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMTIuRGllbTE5MjIuMTkyMikpIC0gbmNvbChNRDE5MjIuMTkyMlssTUQxOTIyLjE5MjJbMSxdPT0xMl0pKQpyb3duYW1lcyhMTzEyLkRpZW0xOTIyLjE5MjMpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMTIuRGllbTE5MjIuMTkyMykpIC0gbmNvbChNRDE5MjIuMTkyM1ssTUQxOTIyLjE5MjNbMSxdPT0xMl0pKQpyb3duYW1lcyhMTzEyLkRpZW0xOTIyLjE5MjQpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMTIuRGllbTE5MjIuMTkyNCkpIC0gbmNvbChNRDE5MjIuMTkyNFssTUQxOTIyLjE5MjRbMSxdPT0xMl0pKQoKCiMtLS0tLS0tLS0tLS0tLS0tLQoKcm93bmFtZXMoTE8xMi5EaWVtMTkyMy4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIzLjE5MjEpKSAtIG5jb2woTUQxOTIzLjE5MjFbLE1EMTkyMy4xOTIxWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyMy4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIzLjE5MjIpKSAtIG5jb2woTUQxOTIzLjE5MjJbLE1EMTkyMy4xOTIyWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyMy4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIzLjE5MjMpKSAtIG5jb2woTUQxOTIzLjE5MjNbLE1EMTkyMy4xOTIzWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyMy4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTIzLjE5MjQpKSAtIG5jb2woTUQxOTIzLjE5MjRbLE1EMTkyMy4xOTI0WzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyNC4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTI0LjE5MjEpKSAtIG5jb2woTUQxOTI0LjE5MjFbLE1EMTkyNC4xOTIxWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyNC4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTI0LjE5MjIpKSAtIG5jb2woTUQxOTI0LjE5MjJbLE1EMTkyNC4xOTIyWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyNC4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTI0LjE5MjMpKSAtIG5jb2woTUQxOTI0LjE5MjNbLE1EMTkyNC4xOTIzWzEsXT09MTJdKSkKcm93bmFtZXMoTE8xMi5EaWVtMTkyNC4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzEyLkRpZW0xOTI0LjE5MjQpKSAtIG5jb2woTUQxOTI0LjE5MjRbLE1EMTkyNC4xOTI0WzEsXT09MTJdKSkKCgoKCkxPVzEyIDwtIGFzLmRhdGEuZnJhbWUoYmluZF9yb3dzKExPMTIuRGllbTE5MjEuMTkyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8xMi5EaWVtMTkyMS4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzEyLkRpZW0xOTIxLjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMTIuRGllbTE5MjEuMTkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8xMi5EaWVtMTkyMi4xOTIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzEyLkRpZW0xOTIyLjE5MjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMTIuRGllbTE5MjIuMTkyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8xMi5EaWVtMTkyMi4xOTI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzEyLkRpZW0xOTIzLjE5MjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMTIuRGllbTE5MjMuMTkyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8xMi5EaWVtMTkyMy4xOTIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzEyLkRpZW0xOTIzLjE5MjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMTIuRGllbTE5MjQuMTkyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8xMi5EaWVtMTkyNC4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzEyLkRpZW0xOTI0LjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMTIuRGllbTE5MjQuMTkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8xMi5sYXN0NS4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzEyLmxhc3Q1LjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMTIubGFzdDUuMTkyNAopKQoKTE9XMTJbaXMubmEoTE9XMTIpXSA8LSAwCgpMT1cxMiA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KExPVzEyLDIsc3VtKSkKTE9XMTIkU29DYXVUTFNhaSA8LSBhcy5udW1lcmljKHJvdy5uYW1lcyhMT1cxMikpCgpMT1cxMiRwZXJjZW50IDwtIHJvdW5kKExPVzEyWywxXS9zdW0oTE9XMTJbLDFdKSwzKQoKI2dyYXBoLS0tLQoKR0xPVzEyIDwtIGdncGxvdChMT1cxMiwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9XMTJbLDJdKSwgeSA9IExPVzEyWywzXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1cxMlssM10pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMTIiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgoKI0xlYXJuaW5nIG91dGNvbWUgMjMKCiNleHBlY3RlZCB0byBiZSAxCgpMTzIzLmxhc3Q1LjE5MjIgPC0gdGFibGUobGFzdDUuMTkyMlstMSxsYXN0NS4xOTIyWzEsXT09MjNdKQojbWluaSBjb25jbHVkZTogMSBxdWVzdGlvbiByZWxhdGVkIHRvIExPMjMgb24gTWFkZTE5MjIgd2FzIGFuc3dlciBieSAxIHN0dWRlbnQKI2FuZCBoaXMvaGVyIGFuc3dlciB3YXMgcmlnaHQgLT4gTE8yMy5sYXN0NS4xOTIyID0gMC4obm8gbmVlZCB0byBhZGQgdG8gY29tYmluZWQpCgpMTzIzLkRpZW0xOTIxLjE5MjEgPC0gdGFibGUoYXBwbHkoRGllbTE5MjEuMTkyMVstMSxEaWVtMTkyMS4xOTIxWzEsXT09MjNdLDEsc3VtKSkKTE8yMy5EaWVtMTkyMS4xOTIyIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIxLjE5MjJbLTEsRGllbTE5MjEuMTkyMlsxLF09PTIzXSwxLHN1bSkpCkxPMjMuRGllbTE5MjEuMTkyMyA8LSB0YWJsZShhcHBseShEaWVtMTkyMS4xOTIzWy0xLERpZW0xOTIxLjE5MjNbMSxdPT0yM10sMSxzdW0pKQpMTzIzLkRpZW0xOTIxLjE5MjQgPC0gdGFibGUoYXBwbHkoRGllbTE5MjEuMTkyNFstMSxEaWVtMTkyMS4xOTI0WzEsXT09MjNdLDEsc3VtKSkKTE8yMy5EaWVtMTkyMi4xOTIxIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIyLjE5MjFbLTEsRGllbTE5MjIuMTkyMVsxLF09PTIzXSwxLHN1bSkpCkxPMjMuRGllbTE5MjIuMTkyMiA8LSB0YWJsZShhcHBseShEaWVtMTkyMi4xOTIyWy0xLERpZW0xOTIyLjE5MjJbMSxdPT0yM10sMSxzdW0pKQpMTzIzLkRpZW0xOTIyLjE5MjMgPC0gdGFibGUoYXBwbHkoRGllbTE5MjIuMTkyM1stMSxEaWVtMTkyMi4xOTIzWzEsXT09MjNdLDEsc3VtKSkKTE8yMy5EaWVtMTkyMi4xOTI0IDwtIHRhYmxlKGFwcGx5KERpZW0xOTIyLjE5MjRbLTEsRGllbTE5MjIuMTkyNFsxLF09PTIzXSwxLHN1bSkpCkxPMjMuRGllbTE5MjMuMTkyMSA8LSB0YWJsZShhcHBseShEaWVtMTkyMy4xOTIxWy0xLERpZW0xOTIzLjE5MjFbMSxdPT0yM10sMSxzdW0pKQpMTzIzLkRpZW0xOTIzLjE5MjIgPC0gdGFibGUoYXBwbHkoRGllbTE5MjMuMTkyMlstMSxEaWVtMTkyMy4xOTIyWzEsXT09MjNdLDEsc3VtKSkKTE8yMy5EaWVtMTkyMy4xOTIzIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIzLjE5MjNbLTEsRGllbTE5MjMuMTkyM1sxLF09PTIzXSwxLHN1bSkpCkxPMjMuRGllbTE5MjMuMTkyNCA8LSB0YWJsZShhcHBseShEaWVtMTkyMy4xOTI0Wy0xLERpZW0xOTIzLjE5MjRbMSxdPT0yM10sMSxzdW0pKQpMTzIzLkRpZW0xOTI0LjE5MjEgPC0gdGFibGUoYXBwbHkoRGllbTE5MjQuMTkyMVstMSxEaWVtMTkyNC4xOTIxWzEsXT09MjNdLDEsc3VtKSkKTE8yMy5EaWVtMTkyNC4xOTIyIDwtIHRhYmxlKGFwcGx5KERpZW0xOTI0LjE5MjJbLTEsRGllbTE5MjQuMTkyMlsxLF09PTIzXSwxLHN1bSkpCkxPMjMuRGllbTE5MjQuMTkyMyA8LSB0YWJsZShhcHBseShEaWVtMTkyNC4xOTIzWy0xLERpZW0xOTI0LjE5MjNbMSxdPT0yM10sMSxzdW0pKQpMTzIzLkRpZW0xOTI0LjE5MjQgPC0gdGFibGUoYXBwbHkoRGllbTE5MjQuMTkyNFstMSxEaWVtMTkyNC4xOTI0WzEsXT09MjNdLDEsc3VtKSkKCiNtYWtlIGNvdW50IHJpZ2h0IGFuc3dlciAtPiB3cm9uZyBhbnN3ZXIKcm93bmFtZXMoTE8yMy5EaWVtMTkyMS4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIxLjE5MjEpKSAtIG5jb2woTUQxOTIxLjE5MjFbLE1EMTkyMS4xOTIxWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyMS4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIxLjE5MjIpKSAtIG5jb2woTUQxOTIxLjE5MjJbLE1EMTkyMS4xOTIyWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyMS4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIxLjE5MjMpKSAtIG5jb2woTUQxOTIxLjE5MjNbLE1EMTkyMS4xOTIzWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyMS4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIxLjE5MjQpKSAtIG5jb2woTUQxOTIxLjE5MjRbLE1EMTkyMS4xOTI0WzEsXT09MjNdKSkKCiNkaWZmZXJlbnQgaXMgaGVyZQpyb3duYW1lcyhMTzIzLkRpZW0xOTIyLjE5MjEpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMjMuRGllbTE5MjIuMTkyMSkpIC0gbmNvbChNRDE5MjIuMTkyMVssTUQxOTIyLjE5MjFbMSxdPT0yM10pKQpyb3duYW1lcyhMTzIzLkRpZW0xOTIyLjE5MjIpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMjMuRGllbTE5MjIuMTkyMikpIC0gbmNvbChNRDE5MjIuMTkyMlssTUQxOTIyLjE5MjJbMSxdPT0yM10pKQpyb3duYW1lcyhMTzIzLkRpZW0xOTIyLjE5MjMpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMjMuRGllbTE5MjIuMTkyMykpIC0gbmNvbChNRDE5MjIuMTkyM1ssTUQxOTIyLjE5MjNbMSxdPT0yM10pKQpyb3duYW1lcyhMTzIzLkRpZW0xOTIyLjE5MjQpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMjMuRGllbTE5MjIuMTkyNCkpIC0gbmNvbChNRDE5MjIuMTkyNFssTUQxOTIyLjE5MjRbMSxdPT0yM10pKQoKCiMtLS0tLS0tLS0tLS0tLS0tLQoKcm93bmFtZXMoTE8yMy5EaWVtMTkyMy4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIzLjE5MjEpKSAtIG5jb2woTUQxOTIzLjE5MjFbLE1EMTkyMy4xOTIxWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyMy4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIzLjE5MjIpKSAtIG5jb2woTUQxOTIzLjE5MjJbLE1EMTkyMy4xOTIyWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyMy4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIzLjE5MjMpKSAtIG5jb2woTUQxOTIzLjE5MjNbLE1EMTkyMy4xOTIzWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyMy4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTIzLjE5MjQpKSAtIG5jb2woTUQxOTIzLjE5MjRbLE1EMTkyMy4xOTI0WzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyNC4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTI0LjE5MjEpKSAtIG5jb2woTUQxOTI0LjE5MjFbLE1EMTkyNC4xOTIxWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyNC4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTI0LjE5MjIpKSAtIG5jb2woTUQxOTI0LjE5MjJbLE1EMTkyNC4xOTIyWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyNC4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTI0LjE5MjMpKSAtIG5jb2woTUQxOTI0LjE5MjNbLE1EMTkyNC4xOTIzWzEsXT09MjNdKSkKcm93bmFtZXMoTE8yMy5EaWVtMTkyNC4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzIzLkRpZW0xOTI0LjE5MjQpKSAtIG5jb2woTUQxOTI0LjE5MjRbLE1EMTkyNC4xOTI0WzEsXT09MjNdKSkKCgoKTE9XMjMgPC0gYXMuZGF0YS5mcmFtZShiaW5kX3Jvd3MoTE8yMy5EaWVtMTkyMS4xOTIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzIzLkRpZW0xOTIxLjE5MjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMjMuRGllbTE5MjEuMTkyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8yMy5EaWVtMTkyMS4xOTI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzIzLkRpZW0xOTIyLjE5MjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMjMuRGllbTE5MjIuMTkyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8yMy5EaWVtMTkyMi4xOTIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzIzLkRpZW0xOTIyLjE5MjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMjMuRGllbTE5MjMuMTkyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8yMy5EaWVtMTkyMy4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzIzLkRpZW0xOTIzLjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMjMuRGllbTE5MjMuMTkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8yMy5EaWVtMTkyNC4xOTIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzIzLkRpZW0xOTI0LjE5MjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMjMuRGllbTE5MjQuMTkyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8yMy5EaWVtMTkyNC4xOTI0LAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCikpCgpMT1cyM1tpcy5uYShMT1cyMyldIDwtIDAKCkxPVzIzIDwtIGFzLmRhdGEuZnJhbWUoYXBwbHkoTE9XMjMsMixzdW0pKQpMT1cyMyRTb0NhdVRMU2FpIDwtIGFzLm51bWVyaWMocm93Lm5hbWVzKExPVzIzKSkKCkxPVzIzJHBlcmNlbnQgPC0gcm91bmQoTE9XMjNbLDFdL3N1bShMT1cyM1ssMV0pLDMpCiNncmFwaC0tLS0KR0xPVzIzIDwtIGdncGxvdChMT1cyMywgYWVzKHggPSBhcy5jaGFyYWN0ZXIoTE9XMjNbLDJdKSwgeSA9IExPVzIzWywzXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MT1cyM1ssM10pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIkxlYXJuaW5nIE91dGNvbWUgMjMiLCB4ID0gIlNvIGNhdSB0cmEgbG9pIHNhaSIsIHkgPSAidGFuIHN1YXQgdHVvbmcgZHVvbmciKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgojTGVhcm5pbmcgb3V0Y29tZSAzMQoKTE8zMS5sYXN0NS4xOTIyIDwtIHRhYmxlKGFwcGx5KGxhc3Q1LjE5MjJbLTEsbGFzdDUuMTkyMlsxLF09PTMxXSwxLHN1bSkpCkxPMzEubGFzdDUuMTkyMyA8LSB0YWJsZShhcHBseShsYXN0NS4xOTIzWy0xLGxhc3Q1LjE5MjNbMSxdPT0zMV0sMSxzdW0pKQpMTzMxLmxhc3Q1LjE5MjQgPC0gdGFibGUoYXBwbHkobGFzdDUuMTkyNFstMSxsYXN0NS4xOTI0WzEsXT09MzFdLDEsc3VtKSkKCnJvd25hbWVzKExPMzEubGFzdDUuMTkyMikgPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoTE8zMS5sYXN0NS4xOTIyKSkgLSBuY29sKEdLQ0RSW0dLQ0RSWywxXT09MTkyMixHS0NEUlsyLF0gPT0gMzFdKSkKcm93bmFtZXMoTE8zMS5sYXN0NS4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLmxhc3Q1LjE5MjMpKSAtIG5jb2woR0tDRFJbR0tDRFJbLDFdPT0xOTIzLEdLQ0RSWzIsXSA9PSAzMV0pKQpyb3duYW1lcyhMTzMxLmxhc3Q1LjE5MjQpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMzEubGFzdDUuMTkyNCkpIC0gbmNvbChHS0NEUltHS0NEUlssMV09PTE5MjQsR0tDRFJbMixdID09IDMxXSkpCgoKTE8zMS5EaWVtMTkyMS4xOTIxIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIxLjE5MjFbLTEsRGllbTE5MjEuMTkyMVsxLF09PTMxXSwxLHN1bSkpCkxPMzEuRGllbTE5MjEuMTkyMiA8LSB0YWJsZShhcHBseShEaWVtMTkyMS4xOTIyWy0xLERpZW0xOTIxLjE5MjJbMSxdPT0zMV0sMSxzdW0pKQpMTzMxLkRpZW0xOTIxLjE5MjMgPC0gdGFibGUoYXBwbHkoRGllbTE5MjEuMTkyM1stMSxEaWVtMTkyMS4xOTIzWzEsXT09MzFdLDEsc3VtKSkKTE8zMS5EaWVtMTkyMS4xOTI0IDwtIHRhYmxlKGFwcGx5KERpZW0xOTIxLjE5MjRbLTEsRGllbTE5MjEuMTkyNFsxLF09PTMxXSwxLHN1bSkpCkxPMzEuRGllbTE5MjIuMTkyMSA8LSB0YWJsZShhcHBseShEaWVtMTkyMi4xOTIxWy0xLERpZW0xOTIyLjE5MjFbMSxdPT0zMV0sMSxzdW0pKQpMTzMxLkRpZW0xOTIyLjE5MjIgPC0gdGFibGUoYXBwbHkoRGllbTE5MjIuMTkyMlstMSxEaWVtMTkyMi4xOTIyWzEsXT09MzFdLDEsc3VtKSkKTE8zMS5EaWVtMTkyMi4xOTIzIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIyLjE5MjNbLTEsRGllbTE5MjIuMTkyM1sxLF09PTMxXSwxLHN1bSkpCkxPMzEuRGllbTE5MjIuMTkyNCA8LSB0YWJsZShhcHBseShEaWVtMTkyMi4xOTI0Wy0xLERpZW0xOTIyLjE5MjRbMSxdPT0zMV0sMSxzdW0pKQpMTzMxLkRpZW0xOTIzLjE5MjEgPC0gdGFibGUoYXBwbHkoRGllbTE5MjMuMTkyMVstMSxEaWVtMTkyMy4xOTIxWzEsXT09MzFdLDEsc3VtKSkKTE8zMS5EaWVtMTkyMy4xOTIyIDwtIHRhYmxlKGFwcGx5KERpZW0xOTIzLjE5MjJbLTEsRGllbTE5MjMuMTkyMlsxLF09PTMxXSwxLHN1bSkpCkxPMzEuRGllbTE5MjMuMTkyMyA8LSB0YWJsZShhcHBseShEaWVtMTkyMy4xOTIzWy0xLERpZW0xOTIzLjE5MjNbMSxdPT0zMV0sMSxzdW0pKQpMTzMxLkRpZW0xOTIzLjE5MjQgPC0gdGFibGUoYXBwbHkoRGllbTE5MjMuMTkyNFstMSxEaWVtMTkyMy4xOTI0WzEsXT09MzFdLDEsc3VtKSkKTE8zMS5EaWVtMTkyNC4xOTIxIDwtIHRhYmxlKGFwcGx5KERpZW0xOTI0LjE5MjFbLTEsRGllbTE5MjQuMTkyMVsxLF09PTMxXSwxLHN1bSkpCkxPMzEuRGllbTE5MjQuMTkyMiA8LSB0YWJsZShhcHBseShEaWVtMTkyNC4xOTIyWy0xLERpZW0xOTI0LjE5MjJbMSxdPT0zMV0sMSxzdW0pKQpMTzMxLkRpZW0xOTI0LjE5MjMgPC0gdGFibGUoYXBwbHkoRGllbTE5MjQuMTkyM1stMSxEaWVtMTkyNC4xOTIzWzEsXT09MzFdLDEsc3VtKSkKTE8zMS5EaWVtMTkyNC4xOTI0IDwtIHRhYmxlKGFwcGx5KERpZW0xOTI0LjE5MjRbLTEsRGllbTE5MjQuMTkyNFsxLF09PTMxXSwxLHN1bSkpCgojbWFrZSBjb3VudCByaWdodCBhbnN3ZXIgLT4gd3JvbmcgYW5zd2VyCnJvd25hbWVzKExPMzEuRGllbTE5MjEuMTkyMSkgPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoTE8zMS5EaWVtMTkyMS4xOTIxKSkgLSBuY29sKE1EMTkyMS4xOTIxWyxNRDE5MjEuMTkyMVsxLF09PTMxXSkpCnJvd25hbWVzKExPMzEuRGllbTE5MjEuMTkyMikgPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoTE8zMS5EaWVtMTkyMS4xOTIyKSkgLSBuY29sKE1EMTkyMS4xOTIyWyxNRDE5MjEuMTkyMlsxLF09PTMxXSkpCnJvd25hbWVzKExPMzEuRGllbTE5MjEuMTkyMykgPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoTE8zMS5EaWVtMTkyMS4xOTIzKSkgLSBuY29sKE1EMTkyMS4xOTIzWyxNRDE5MjEuMTkyM1sxLF09PTMxXSkpCnJvd25hbWVzKExPMzEuRGllbTE5MjEuMTkyNCkgPC0gYWJzKGFzLm51bWVyaWMocm93bmFtZXMoTE8zMS5EaWVtMTkyMS4xOTI0KSkgLSBuY29sKE1EMTkyMS4xOTI0WyxNRDE5MjEuMTkyNFsxLF09PTMxXSkpCgpyb3duYW1lcyhMTzMxLkRpZW0xOTIyLjE5MjEpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMzEuRGllbTE5MjIuMTkyMSkpIC0gbmNvbChNRDE5MjIuMTkyMVssTUQxOTIyLjE5MjFbMSxdPT0zMV0pKQpyb3duYW1lcyhMTzMxLkRpZW0xOTIyLjE5MjIpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMzEuRGllbTE5MjIuMTkyMikpIC0gbmNvbChNRDE5MjIuMTkyMlssTUQxOTIyLjE5MjJbMSxdPT0zMV0pKQpyb3duYW1lcyhMTzMxLkRpZW0xOTIyLjE5MjMpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMzEuRGllbTE5MjIuMTkyMykpIC0gbmNvbChNRDE5MjIuMTkyM1ssTUQxOTIyLjE5MjNbMSxdPT0zMV0pKQpyb3duYW1lcyhMTzMxLkRpZW0xOTIyLjE5MjQpIDwtIGFicyhhcy5udW1lcmljKHJvd25hbWVzKExPMzEuRGllbTE5MjIuMTkyNCkpIC0gbmNvbChNRDE5MjIuMTkyNFssTUQxOTIyLjE5MjRbMSxdPT0zMV0pKQoKCiMtLS0tLS0tLS0tLS0tLS0tLQoKcm93bmFtZXMoTE8zMS5EaWVtMTkyMy4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTIzLjE5MjEpKSAtIG5jb2woTUQxOTIzLjE5MjFbLE1EMTkyMy4xOTIxWzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyMy4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTIzLjE5MjIpKSAtIG5jb2woTUQxOTIzLjE5MjJbLE1EMTkyMy4xOTIyWzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyMy4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTIzLjE5MjMpKSAtIG5jb2woTUQxOTIzLjE5MjNbLE1EMTkyMy4xOTIzWzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyMy4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTIzLjE5MjQpKSAtIG5jb2woTUQxOTIzLjE5MjRbLE1EMTkyMy4xOTI0WzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyNC4xOTIxKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTI0LjE5MjEpKSAtIG5jb2woTUQxOTI0LjE5MjFbLE1EMTkyNC4xOTIxWzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyNC4xOTIyKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTI0LjE5MjIpKSAtIG5jb2woTUQxOTI0LjE5MjJbLE1EMTkyNC4xOTIyWzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyNC4xOTIzKSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTI0LjE5MjMpKSAtIG5jb2woTUQxOTI0LjE5MjNbLE1EMTkyNC4xOTIzWzEsXT09MzFdKSkKcm93bmFtZXMoTE8zMS5EaWVtMTkyNC4xOTI0KSA8LSBhYnMoYXMubnVtZXJpYyhyb3duYW1lcyhMTzMxLkRpZW0xOTI0LjE5MjQpKSAtIG5jb2woTUQxOTI0LjE5MjRbLE1EMTkyNC4xOTI0WzEsXT09MzFdKSkKCgoKCkxPVzMxIDwtIGFzLmRhdGEuZnJhbWUoYmluZF9yb3dzKExPMzEuRGllbTE5MjEuMTkyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8zMS5EaWVtMTkyMS4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzMxLkRpZW0xOTIxLjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzEuRGllbTE5MjEuMTkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8zMS5EaWVtMTkyMi4xOTIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzMxLkRpZW0xOTIyLjE5MjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzEuRGllbTE5MjIuMTkyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8zMS5EaWVtMTkyMi4xOTI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzMxLkRpZW0xOTIzLjE5MjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzEuRGllbTE5MjMuMTkyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8zMS5EaWVtMTkyMy4xOTIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzMxLkRpZW0xOTIzLjE5MjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzEuRGllbTE5MjQuMTkyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8zMS5EaWVtMTkyNC4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzMxLkRpZW0xOTI0LjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzEuRGllbTE5MjQuMTkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE8zMS5sYXN0NS4xOTIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTzMxLmxhc3Q1LjE5MjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPMzEubGFzdDUuMTkyNAopKQoKTE9XMzFbaXMubmEoTE9XMzEpXSA8LSAwCgpMT1czMSA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KExPVzMxLDIsc3VtKSkKTE9XMzEkU29DYXVUTFNhaSA8LSBhcy5udW1lcmljKHJvdy5uYW1lcyhMT1czMSkpCgpMT1czMSRwZXJjZW50IDwtIHJvdW5kKExPVzMxWywxXS9zdW0oTE9XMzFbLDFdKSwzKQoKCkdMT1czMSA8LSBnZ3Bsb3QoTE9XMzEsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKExPVzMxWywyXSksIHkgPSBMT1czMVssM10pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9TE9XMzFbLDNdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJMZWFybmluZyBPdXRjb21lIDMxIiwgeCA9ICJTbyBjYXUgdHJhIGxvaSBzYWkiLCB5ID0gInRhbiBzdWF0IHR1b25nIGR1b25nIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Q1NTdkNSIpKQpgYGAKCmBgYHtyfQojZ3JhcGgtLS0tCkdXIDwtIGdnYXJyYW5nZShHTE9XLkdLMTEsIEdMT1cxMiwgR0xPVy5HSzIxLCBHTE9XLkdLMjIsIEdMT1cyMywgR0xPVzMxLCBHTE9XLkNLMzIsIG5jb2w9MiwgbnJvdyA9IDQpCkdXCmBgYAoKUGhhbiBWCmBgYHtyfQojIENhdSBWSS4yCiMgR2FuIHAgPSAxCnAgPC0gMQoKI3JldXNlIERpZW1HSyAmIERpZW1DSwpEaWVtR0tDSy4yPC0gY2JpbmQoIERpZW1HS1sxOjM2MSxdLERpZW1DSykKCiNhZGQgY29tYmluZWQgbWFkZQpEaWVtR0tDSy4yJG1kQ0tfR0sgPC0gYXMubnVtZXJpYyhwYXN0ZShEaWVtR0tDSy4yWywyOV0gLERpZW1HS0NLLjJbLDYyXSwgc2VwID0gIiIpKQojcmVhcnJhbmdlCkRpZW1HS0NLLjIgPC0gRGllbUdLQ0suMlssYyg2MywxOjI4LCAzMzo2MSldCgpjb2xuYW1lcyhEaWVtR0tDSy4yKVtjKDU6MjkpXSA8LSBjKDE6MjUpCmNvbG5hbWVzKERpZW1HS0NLLjIpW2MoMzA6NTgpXSA8LSBjKDI2OjU0KQoKRGllbTIuMTkyMS4xOTIxIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjEuMTkyMSxEaWVtR0tDSy4yW0RpZW1HS0NLLjJbMV0gPT0gMTkyMTE5MjEsYygyLDU6NTgpXSksMixhcy5udW1lcmljKQpEaWVtMi4xOTIxLjE5MjIgPC0gYXBwbHkoYmluZF9yb3dzKE1EMTkyMS4xOTIyLERpZW1HS0NLLjJbRGllbUdLQ0suMlsxXSA9PSAxOTIxMTkyMixjKDIsNTo1OCldKSwyLGFzLm51bWVyaWMpCkRpZW0yLjE5MjEuMTkyMyA8LSBhcHBseShiaW5kX3Jvd3MoTUQxOTIxLjE5MjMsRGllbUdLQ0suMltEaWVtR0tDSy4yWzFdID09IDE5MjExOTIzLGMoMiw1OjU4KV0pLDIsYXMubnVtZXJpYykKRGllbTIuMTkyMS4xOTI0IDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjEuMTkyNCxEaWVtR0tDSy4yW0RpZW1HS0NLLjJbMV0gPT0gMTkyMTE5MjQsYygyLDU6NTgpXSksMixhcy5udW1lcmljKQpEaWVtMi4xOTIyLjE5MjEgPC0gYXBwbHkoYmluZF9yb3dzKE1EMTkyMi4xOTIxLERpZW1HS0NLLjJbRGllbUdLQ0suMlsxXSA9PSAxOTIyMTkyMSxjKDIsNTo1OCldKSwyLGFzLm51bWVyaWMpCkRpZW0yLjE5MjIuMTkyMiA8LSBhcHBseShiaW5kX3Jvd3MoTUQxOTIyLjE5MjIsRGllbUdLQ0suMltEaWVtR0tDSy4yWzFdID09IDE5MjIxOTIyLGMoMiw1OjU4KV0pLDIsYXMubnVtZXJpYykKRGllbTIuMTkyMi4xOTIzIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjIuMTkyMyxEaWVtR0tDSy4yW0RpZW1HS0NLLjJbMV0gPT0gMTkyMjE5MjMsYygyLDU6NTgpXSksMixhcy5udW1lcmljKQpEaWVtMi4xOTIyLjE5MjQgPC0gYXBwbHkoYmluZF9yb3dzKE1EMTkyMi4xOTI0LERpZW1HS0NLLjJbRGllbUdLQ0suMlsxXSA9PSAxOTIyMTkyNCxjKDIsNTo1OCldKSwyLGFzLm51bWVyaWMpCkRpZW0yLjE5MjMuMTkyMSA8LSBhcHBseShiaW5kX3Jvd3MoTUQxOTIzLjE5MjEsRGllbUdLQ0suMltEaWVtR0tDSy4yWzFdID09IDE5MjMxOTIxLGMoMiw1OjU4KV0pLDIsYXMubnVtZXJpYykKRGllbTIuMTkyMy4xOTIyIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjMuMTkyMixEaWVtR0tDSy4yW0RpZW1HS0NLLjJbMV0gPT0gMTkyMzE5MjIsYygyLDU6NTgpXSksMixhcy5udW1lcmljKQpEaWVtMi4xOTIzLjE5MjMgPC0gYXBwbHkoYmluZF9yb3dzKE1EMTkyMy4xOTIzLERpZW1HS0NLLjJbRGllbUdLQ0suMlsxXSA9PSAxOTIzMTkyMyxjKDIsNTo1OCldKSwyLGFzLm51bWVyaWMpCkRpZW0yLjE5MjMuMTkyNCA8LSBhcHBseShiaW5kX3Jvd3MoTUQxOTIzLjE5MjQsRGllbUdLQ0suMltEaWVtR0tDSy4yWzFdID09IDE5MjMxOTI0LGMoMiw1OjU4KV0pLDIsYXMubnVtZXJpYykKRGllbTIuMTkyNC4xOTIxIDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjQuMTkyMSxEaWVtR0tDSy4yW0RpZW1HS0NLLjJbMV0gPT0gMTkyNDE5MjEsYygyLDU6NTgpXSksMixhcy5udW1lcmljKQpEaWVtMi4xOTI0LjE5MjIgPC0gYXBwbHkoYmluZF9yb3dzKE1EMTkyNC4xOTIyLERpZW1HS0NLLjJbRGllbUdLQ0suMlsxXSA9PSAxOTI0MTkyMixjKDIsNTo1OCldKSwyLGFzLm51bWVyaWMpCkRpZW0yLjE5MjQuMTkyMyA8LSBhcHBseShiaW5kX3Jvd3MoTUQxOTI0LjE5MjMsRGllbUdLQ0suMltEaWVtR0tDSy4yWzFdID09IDE5MjQxOTIzLGMoMiw1OjU4KV0pLDIsYXMubnVtZXJpYykKRGllbTIuMTkyNC4xOTI0IDwtIGFwcGx5KGJpbmRfcm93cyhNRDE5MjQuMTkyNCxEaWVtR0tDSy4yW0RpZW1HS0NLLjJbMV0gPT0gMTkyNDE5MjQsYygyLDU6NTgpXSksMixhcy5udW1lcmljKQoKRGllbTIuTE8xMi4xOTIxLjE5MjEgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIxLjE5MjFbLERpZW0yLjE5MjEuMTkyMVsxLF0gPT0gMTIgfCBpcy5uYShEaWVtMi4xOTIxLjE5MjFbMSxdKV0pIApEaWVtMi5MTzEyLjE5MjEuMTkyMiA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjEuMTkyMlssRGllbTIuMTkyMS4xOTIyWzEsXSA9PSAxMiB8IGlzLm5hKERpZW0yLjE5MjEuMTkyMlsxLF0pXSkgCkRpZW0yLkxPMTIuMTkyMS4xOTIzIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMS4xOTIzWyxEaWVtMi4xOTIxLjE5MjNbMSxdID09IDEyIHwgaXMubmEoRGllbTIuMTkyMS4xOTIzWzEsXSldKSAKRGllbTIuTE8xMi4xOTIxLjE5MjQgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIxLjE5MjRbLERpZW0yLjE5MjEuMTkyNFsxLF0gPT0gMTIgfCBpcy5uYShEaWVtMi4xOTIxLjE5MjRbMSxdKV0pIApEaWVtMi5MTzEyLjE5MjIuMTkyMSA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjIuMTkyMVssRGllbTIuMTkyMi4xOTIxWzEsXSA9PSAxMiB8IGlzLm5hKERpZW0yLjE5MjIuMTkyMVsxLF0pXSkgCkRpZW0yLkxPMTIuMTkyMi4xOTIyIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMi4xOTIyWyxEaWVtMi4xOTIyLjE5MjJbMSxdID09IDEyIHwgaXMubmEoRGllbTIuMTkyMi4xOTIyWzEsXSldKSAKRGllbTIuTE8xMi4xOTIyLjE5MjMgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIyLjE5MjNbLERpZW0yLjE5MjIuMTkyM1sxLF0gPT0gMTIgfCBpcy5uYShEaWVtMi4xOTIyLjE5MjNbMSxdKV0pIApEaWVtMi5MTzEyLjE5MjIuMTkyNCA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjIuMTkyNFssRGllbTIuMTkyMi4xOTI0WzEsXSA9PSAxMiB8IGlzLm5hKERpZW0yLjE5MjIuMTkyNFsxLF0pXSkgCkRpZW0yLkxPMTIuMTkyMy4xOTIxIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMy4xOTIxWyxEaWVtMi4xOTIzLjE5MjFbMSxdID09IDEyIHwgaXMubmEoRGllbTIuMTkyMy4xOTIxWzEsXSldKSAKRGllbTIuTE8xMi4xOTIzLjE5MjIgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIzLjE5MjJbLERpZW0yLjE5MjMuMTkyMlsxLF0gPT0gMTIgfCBpcy5uYShEaWVtMi4xOTIzLjE5MjJbMSxdKV0pIApEaWVtMi5MTzEyLjE5MjMuMTkyMyA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjMuMTkyM1ssRGllbTIuMTkyMy4xOTIzWzEsXSA9PSAxMiB8IGlzLm5hKERpZW0yLjE5MjMuMTkyM1sxLF0pXSkgCkRpZW0yLkxPMTIuMTkyMy4xOTI0IDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMy4xOTI0WyxEaWVtMi4xOTIzLjE5MjRbMSxdID09IDEyIHwgaXMubmEoRGllbTIuMTkyMy4xOTI0WzEsXSldKSAKRGllbTIuTE8xMi4xOTI0LjE5MjEgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTI0LjE5MjFbLERpZW0yLjE5MjQuMTkyMVsxLF0gPT0gMTIgfCBpcy5uYShEaWVtMi4xOTI0LjE5MjFbMSxdKV0pIApEaWVtMi5MTzEyLjE5MjQuMTkyMiA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjQuMTkyMlssRGllbTIuMTkyNC4xOTIyWzEsXSA9PSAxMiB8IGlzLm5hKERpZW0yLjE5MjQuMTkyMlsxLF0pXSkgCkRpZW0yLkxPMTIuMTkyNC4xOTIzIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyNC4xOTIzWyxEaWVtMi4xOTI0LjE5MjNbMSxdID09IDEyIHwgaXMubmEoRGllbTIuMTkyNC4xOTIzWzEsXSldKSAKRGllbTIuTE8xMi4xOTI0LjE5MjQgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTI0LjE5MjRbLERpZW0yLjE5MjQuMTkyNFsxLF0gPT0gMTIgfCBpcy5uYShEaWVtMi4xOTI0LjE5MjRbMSxdKV0pIAoKCgpEaWVtMi5MTzEyLjE5MjEuMTkyMSRUTEQ8LSBhcHBseShEaWVtMi5MTzEyLjE5MjEuMTkyMVssYygxOm5jb2woTUQxOTIxLjE5MjFbLE1EMTkyMS4xOTIxID09IDEyXSkpXSwxLHN1bSkKRGllbTIuTE8xMi4xOTIxLjE5MjFbRGllbTIuTE8xMi4xOTIxLjE5MjFbLTEsIlRMRCJdID49IG5jb2woTUQxOTIxLjE5MjFbLE1EMTkyMS4xOTIxID09IDEyXSkgLSBwLCJOTyJdCgpEaWVtMi5MTzEyLjE5MjEuMTkyMSRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIxLjE5MjFbLGMoMTpuY29sKE1EMTkyMS4xOTIxWyxNRDE5MjEuMTkyMSA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjEuMTkyMiRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIxLjE5MjJbLGMoMTpuY29sKE1EMTkyMS4xOTIyWyxNRDE5MjEuMTkyMiA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjEuMTkyMyRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIxLjE5MjNbLGMoMTpuY29sKE1EMTkyMS4xOTIzWyxNRDE5MjEuMTkyMyA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjEuMTkyNCRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIxLjE5MjRbLGMoMTpuY29sKE1EMTkyMS4xOTI0WyxNRDE5MjEuMTkyNCA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjIuMTkyMSRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIyLjE5MjFbLGMoMTpuY29sKE1EMTkyMi4xOTIxWyxNRDE5MjIuMTkyMSA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjIuMTkyMiRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIyLjE5MjJbLGMoMTpuY29sKE1EMTkyMi4xOTIyWyxNRDE5MjIuMTkyMiA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjIuMTkyMyRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIyLjE5MjNbLGMoMTpuY29sKE1EMTkyMi4xOTIzWyxNRDE5MjIuMTkyMyA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjIuMTkyNCRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIyLjE5MjRbLGMoMTpuY29sKE1EMTkyMi4xOTI0WyxNRDE5MjIuMTkyNCA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjMuMTkyMSRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIzLjE5MjFbLGMoMTpuY29sKE1EMTkyMy4xOTIxWyxNRDE5MjMuMTkyMSA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjMuMTkyMiRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIzLjE5MjJbLGMoMTpuY29sKE1EMTkyMy4xOTIyWyxNRDE5MjMuMTkyMiA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjMuMTkyMyRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIzLjE5MjNbLGMoMTpuY29sKE1EMTkyMy4xOTIzWyxNRDE5MjMuMTkyMyA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjMuMTkyNCRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTIzLjE5MjRbLGMoMTpuY29sKE1EMTkyMy4xOTI0WyxNRDE5MjMuMTkyNCA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjQuMTkyMSRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTI0LjE5MjFbLGMoMTpuY29sKE1EMTkyNC4xOTIxWyxNRDE5MjQuMTkyMSA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjQuMTkyMiRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTI0LjE5MjJbLGMoMTpuY29sKE1EMTkyNC4xOTIyWyxNRDE5MjQuMTkyMiA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjQuMTkyMyRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTI0LjE5MjNbLGMoMTpuY29sKE1EMTkyNC4xOTIzWyxNRDE5MjQuMTkyMyA9PSAxMl0pKV0sMSxzdW0pIApEaWVtMi5MTzEyLjE5MjQuMTkyNCRUTEQgPC0gYXBwbHkoRGllbTIuTE8xMi4xOTI0LjE5MjRbLGMoMTpuY29sKE1EMTkyNC4xOTI0WyxNRDE5MjQuMTkyNCA9PSAxMl0pKV0sMSxzdW0pIAoKCiNsaXN0IG9mIHN0dWRlbnQgbWVldHMgbGVhcm5pbmcgb3V0Y29tZSAxMiByZXN1bHQgcmVxdWlyZW1lbnQKTE8xMlNWTGlzdCA8LSAoIlNWIikKCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMS4xOTIxW0RpZW0yLkxPMTIuMTkyMS4xOTIxWywiVExEIl0gPj0gbmNvbChNRDE5MjEuMTkyMVssTUQxOTIxLjE5MjEgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMS4xOTIyW0RpZW0yLkxPMTIuMTkyMS4xOTIyWywiVExEIl0gPj0gbmNvbChNRDE5MjEuMTkyMlssTUQxOTIxLjE5MjIgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMS4xOTIzW0RpZW0yLkxPMTIuMTkyMS4xOTIzWywiVExEIl0gPj0gbmNvbChNRDE5MjEuMTkyM1ssTUQxOTIxLjE5MjMgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMS4xOTI0W0RpZW0yLkxPMTIuMTkyMS4xOTI0WywiVExEIl0gPj0gbmNvbChNRDE5MjEuMTkyNFssTUQxOTIxLjE5MjQgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMi4xOTIxW0RpZW0yLkxPMTIuMTkyMi4xOTIxWywiVExEIl0gPj0gbmNvbChNRDE5MjIuMTkyMVssTUQxOTIyLjE5MjEgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMi4xOTIyW0RpZW0yLkxPMTIuMTkyMi4xOTIyWywiVExEIl0gPj0gbmNvbChNRDE5MjIuMTkyMlssTUQxOTIyLjE5MjIgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMi4xOTIzW0RpZW0yLkxPMTIuMTkyMi4xOTIzWywiVExEIl0gPj0gbmNvbChNRDE5MjIuMTkyM1ssTUQxOTIyLjE5MjMgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMi4xOTI0W0RpZW0yLkxPMTIuMTkyMi4xOTI0WywiVExEIl0gPj0gbmNvbChNRDE5MjIuMTkyNFssTUQxOTIyLjE5MjQgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMy4xOTIxW0RpZW0yLkxPMTIuMTkyMy4xOTIxWywiVExEIl0gPj0gbmNvbChNRDE5MjMuMTkyMVssTUQxOTIzLjE5MjEgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMy4xOTIyW0RpZW0yLkxPMTIuMTkyMy4xOTIyWywiVExEIl0gPj0gbmNvbChNRDE5MjMuMTkyMlssTUQxOTIzLjE5MjIgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMy4xOTIzW0RpZW0yLkxPMTIuMTkyMy4xOTIzWywiVExEIl0gPj0gbmNvbChNRDE5MjMuMTkyM1ssTUQxOTIzLjE5MjMgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyMy4xOTI0W0RpZW0yLkxPMTIuMTkyMy4xOTI0WywiVExEIl0gPj0gbmNvbChNRDE5MjMuMTkyNFssTUQxOTIzLjE5MjQgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyNC4xOTIxW0RpZW0yLkxPMTIuMTkyNC4xOTIxWywiVExEIl0gPj0gbmNvbChNRDE5MjQuMTkyMVssTUQxOTI0LjE5MjEgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyNC4xOTIyW0RpZW0yLkxPMTIuMTkyNC4xOTIyWywiVExEIl0gPj0gbmNvbChNRDE5MjQuMTkyMlssTUQxOTI0LjE5MjIgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyNC4xOTIzW0RpZW0yLkxPMTIuMTkyNC4xOTIzWywiVExEIl0gPj0gbmNvbChNRDE5MjQuMTkyM1ssTUQxOTI0LjE5MjMgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCkxPMTJTVkxpc3QgPC0gYyhMTzEyU1ZMaXN0LERpZW0yLkxPMTIuMTkyNC4xOTI0W0RpZW0yLkxPMTIuMTkyNC4xOTI0WywiVExEIl0gPj0gbmNvbChNRDE5MjQuMTkyNFssTUQxOTI0LjE5MjQgPT0gMTJdKSAtIHAsIk5vIiBdKSAgCgoKCgojbGlzdCBvZiBzdHVkZW50IG1lZXRzIGxlYXJuaW5nIG91dGNvbWUgMTIgcmVzdWx0IHJlcXVpcmVtZW50CkxPMTJTVkxpc3QKbmEub21pdChhcy5kYXRhLmZyYW1lKExPMTJTVkxpc3QpKQoKCkRpZW0yLkxPMzEuMTkyMS4xOTIxIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMS4xOTIxWyxEaWVtMi4xOTIxLjE5MjFbMSxdID09IDMxIHwgaXMubmEoRGllbTIuMTkyMS4xOTIxWzEsXSldKSAKRGllbTIuTE8zMS4xOTIxLjE5MjIgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIxLjE5MjJbLERpZW0yLjE5MjEuMTkyMlsxLF0gPT0gMzEgfCBpcy5uYShEaWVtMi4xOTIxLjE5MjJbMSxdKV0pIApEaWVtMi5MTzMxLjE5MjEuMTkyMyA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjEuMTkyM1ssRGllbTIuMTkyMS4xOTIzWzEsXSA9PSAzMSB8IGlzLm5hKERpZW0yLjE5MjEuMTkyM1sxLF0pXSkgCkRpZW0yLkxPMzEuMTkyMS4xOTI0IDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMS4xOTI0WyxEaWVtMi4xOTIxLjE5MjRbMSxdID09IDMxIHwgaXMubmEoRGllbTIuMTkyMS4xOTI0WzEsXSldKSAKRGllbTIuTE8zMS4xOTIyLjE5MjEgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIyLjE5MjFbLERpZW0yLjE5MjIuMTkyMVsxLF0gPT0gMzEgfCBpcy5uYShEaWVtMi4xOTIyLjE5MjFbMSxdKV0pIApEaWVtMi5MTzMxLjE5MjIuMTkyMiA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjIuMTkyMlssRGllbTIuMTkyMi4xOTIyWzEsXSA9PSAzMSB8IGlzLm5hKERpZW0yLjE5MjIuMTkyMlsxLF0pXSkgCkRpZW0yLkxPMzEuMTkyMi4xOTIzIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMi4xOTIzWyxEaWVtMi4xOTIyLjE5MjNbMSxdID09IDMxIHwgaXMubmEoRGllbTIuMTkyMi4xOTIzWzEsXSldKSAKRGllbTIuTE8zMS4xOTIyLjE5MjQgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIyLjE5MjRbLERpZW0yLjE5MjIuMTkyNFsxLF0gPT0gMzEgfCBpcy5uYShEaWVtMi4xOTIyLjE5MjRbMSxdKV0pIApEaWVtMi5MTzMxLjE5MjMuMTkyMSA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjMuMTkyMVssRGllbTIuMTkyMy4xOTIxWzEsXSA9PSAzMSB8IGlzLm5hKERpZW0yLjE5MjMuMTkyMVsxLF0pXSkgCkRpZW0yLkxPMzEuMTkyMy4xOTIyIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyMy4xOTIyWyxEaWVtMi4xOTIzLjE5MjJbMSxdID09IDMxIHwgaXMubmEoRGllbTIuMTkyMy4xOTIyWzEsXSldKSAKRGllbTIuTE8zMS4xOTIzLjE5MjMgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTIzLjE5MjNbLERpZW0yLjE5MjMuMTkyM1sxLF0gPT0gMzEgfCBpcy5uYShEaWVtMi4xOTIzLjE5MjNbMSxdKV0pIApEaWVtMi5MTzMxLjE5MjMuMTkyNCA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjMuMTkyNFssRGllbTIuMTkyMy4xOTI0WzEsXSA9PSAzMSB8IGlzLm5hKERpZW0yLjE5MjMuMTkyNFsxLF0pXSkgCkRpZW0yLkxPMzEuMTkyNC4xOTIxIDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyNC4xOTIxWyxEaWVtMi4xOTI0LjE5MjFbMSxdID09IDMxIHwgaXMubmEoRGllbTIuMTkyNC4xOTIxWzEsXSldKSAKRGllbTIuTE8zMS4xOTI0LjE5MjIgPC0gYXMuZGF0YS5mcmFtZShEaWVtMi4xOTI0LjE5MjJbLERpZW0yLjE5MjQuMTkyMlsxLF0gPT0gMzEgfCBpcy5uYShEaWVtMi4xOTI0LjE5MjJbMSxdKV0pIApEaWVtMi5MTzMxLjE5MjQuMTkyMyA8LSBhcy5kYXRhLmZyYW1lKERpZW0yLjE5MjQuMTkyM1ssRGllbTIuMTkyNC4xOTIzWzEsXSA9PSAzMSB8IGlzLm5hKERpZW0yLjE5MjQuMTkyM1sxLF0pXSkgCkRpZW0yLkxPMzEuMTkyNC4xOTI0IDwtIGFzLmRhdGEuZnJhbWUoRGllbTIuMTkyNC4xOTI0WyxEaWVtMi4xOTI0LjE5MjRbMSxdID09IDMxIHwgaXMubmEoRGllbTIuMTkyNC4xOTI0WzEsXSldKSAKCgoKRGllbTIuTE8zMS4xOTIxLjE5MjEkVExEPC0gYXBwbHkoRGllbTIuTE8zMS4xOTIxLjE5MjFbLGMoMTpuY29sKE1EMTkyMS4xOTIxWyxNRDE5MjEuMTkyMSA9PSAzMV0pKV0sMSxzdW0pCkRpZW0yLkxPMzEuMTkyMS4xOTIxW0RpZW0yLkxPMzEuMTkyMS4xOTIxWy0xLCJUTEQiXSA+PSBuY29sKE1EMTkyMS4xOTIxWyxNRDE5MjEuMTkyMSA9PSAzMV0pIC0gcCwiTk8iXQoKRGllbTIuTE8zMS4xOTIxLjE5MjEkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMS4xOTIxWyxjKDE6bmNvbChNRDE5MjEuMTkyMVssTUQxOTIxLjE5MjEgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIxLjE5MjIkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMS4xOTIyWyxjKDE6bmNvbChNRDE5MjEuMTkyMlssTUQxOTIxLjE5MjIgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIxLjE5MjMkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMS4xOTIzWyxjKDE6bmNvbChNRDE5MjEuMTkyM1ssTUQxOTIxLjE5MjMgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIxLjE5MjQkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMS4xOTI0WyxjKDE6bmNvbChNRDE5MjEuMTkyNFssTUQxOTIxLjE5MjQgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIyLjE5MjEkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMi4xOTIxWyxjKDE6bmNvbChNRDE5MjIuMTkyMVssTUQxOTIyLjE5MjEgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIyLjE5MjIkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMi4xOTIyWyxjKDE6bmNvbChNRDE5MjIuMTkyMlssTUQxOTIyLjE5MjIgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIyLjE5MjMkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMi4xOTIzWyxjKDE6bmNvbChNRDE5MjIuMTkyM1ssTUQxOTIyLjE5MjMgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIyLjE5MjQkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMi4xOTI0WyxjKDE6bmNvbChNRDE5MjIuMTkyNFssTUQxOTIyLjE5MjQgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIzLjE5MjEkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMy4xOTIxWyxjKDE6bmNvbChNRDE5MjMuMTkyMVssTUQxOTIzLjE5MjEgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIzLjE5MjIkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMy4xOTIyWyxjKDE6bmNvbChNRDE5MjMuMTkyMlssTUQxOTIzLjE5MjIgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIzLjE5MjMkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMy4xOTIzWyxjKDE6bmNvbChNRDE5MjMuMTkyM1ssTUQxOTIzLjE5MjMgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTIzLjE5MjQkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyMy4xOTI0WyxjKDE6bmNvbChNRDE5MjMuMTkyNFssTUQxOTIzLjE5MjQgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTI0LjE5MjEkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyNC4xOTIxWyxjKDE6bmNvbChNRDE5MjQuMTkyMVssTUQxOTI0LjE5MjEgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTI0LjE5MjIkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyNC4xOTIyWyxjKDE6bmNvbChNRDE5MjQuMTkyMlssTUQxOTI0LjE5MjIgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTI0LjE5MjMkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyNC4xOTIzWyxjKDE6bmNvbChNRDE5MjQuMTkyM1ssTUQxOTI0LjE5MjMgPT0gMzFdKSldLDEsc3VtKSAKRGllbTIuTE8zMS4xOTI0LjE5MjQkVExEIDwtIGFwcGx5KERpZW0yLkxPMzEuMTkyNC4xOTI0WyxjKDE6bmNvbChNRDE5MjQuMTkyNFssTUQxOTI0LjE5MjQgPT0gMzFdKSldLDEsc3VtKSAKCgojbGlzdCBvZiBzdHVkZW50IG1lZXRzIGxlYXJuaW5nIG91dGNvbWUgMzEgcmVzdWx0IHJlcXVpcmVtZW50CkxPMzFTVkxpc3QgPC0gIlNWIgoKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIxLjE5MjFbRGllbTIuTE8zMS4xOTIxLjE5MjFbLCJUTEQiXSA+PSBuY29sKE1EMTkyMS4xOTIxWyxNRDE5MjEuMTkyMSA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIxLjE5MjJbRGllbTIuTE8zMS4xOTIxLjE5MjJbLCJUTEQiXSA+PSBuY29sKE1EMTkyMS4xOTIyWyxNRDE5MjEuMTkyMiA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIxLjE5MjNbRGllbTIuTE8zMS4xOTIxLjE5MjNbLCJUTEQiXSA+PSBuY29sKE1EMTkyMS4xOTIzWyxNRDE5MjEuMTkyMyA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIxLjE5MjRbRGllbTIuTE8zMS4xOTIxLjE5MjRbLCJUTEQiXSA+PSBuY29sKE1EMTkyMS4xOTI0WyxNRDE5MjEuMTkyNCA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIyLjE5MjFbRGllbTIuTE8zMS4xOTIyLjE5MjFbLCJUTEQiXSA+PSBuY29sKE1EMTkyMi4xOTIxWyxNRDE5MjIuMTkyMSA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIyLjE5MjJbRGllbTIuTE8zMS4xOTIyLjE5MjJbLCJUTEQiXSA+PSBuY29sKE1EMTkyMi4xOTIyWyxNRDE5MjIuMTkyMiA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIyLjE5MjNbRGllbTIuTE8zMS4xOTIyLjE5MjNbLCJUTEQiXSA+PSBuY29sKE1EMTkyMi4xOTIzWyxNRDE5MjIuMTkyMyA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIyLjE5MjRbRGllbTIuTE8zMS4xOTIyLjE5MjRbLCJUTEQiXSA+PSBuY29sKE1EMTkyMi4xOTI0WyxNRDE5MjIuMTkyNCA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIzLjE5MjFbRGllbTIuTE8zMS4xOTIzLjE5MjFbLCJUTEQiXSA+PSBuY29sKE1EMTkyMy4xOTIxWyxNRDE5MjMuMTkyMSA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIzLjE5MjJbRGllbTIuTE8zMS4xOTIzLjE5MjJbLCJUTEQiXSA+PSBuY29sKE1EMTkyMy4xOTIyWyxNRDE5MjMuMTkyMiA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIzLjE5MjNbRGllbTIuTE8zMS4xOTIzLjE5MjNbLCJUTEQiXSA+PSBuY29sKE1EMTkyMy4xOTIzWyxNRDE5MjMuMTkyMyA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTIzLjE5MjRbRGllbTIuTE8zMS4xOTIzLjE5MjRbLCJUTEQiXSA+PSBuY29sKE1EMTkyMy4xOTI0WyxNRDE5MjMuMTkyNCA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTI0LjE5MjFbRGllbTIuTE8zMS4xOTI0LjE5MjFbLCJUTEQiXSA+PSBuY29sKE1EMTkyNC4xOTIxWyxNRDE5MjQuMTkyMSA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTI0LjE5MjJbRGllbTIuTE8zMS4xOTI0LjE5MjJbLCJUTEQiXSA+PSBuY29sKE1EMTkyNC4xOTIyWyxNRDE5MjQuMTkyMiA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTI0LjE5MjNbRGllbTIuTE8zMS4xOTI0LjE5MjNbLCJUTEQiXSA+PSBuY29sKE1EMTkyNC4xOTIzWyxNRDE5MjQuMTkyMyA9PSAzMV0pIC0gcCwiTm8iIF0pICAKTE8zMVNWTGlzdCA8LSBjKExPMzFTVkxpc3QsRGllbTIuTE8zMS4xOTI0LjE5MjRbRGllbTIuTE8zMS4xOTI0LjE5MjRbLCJUTEQiXSA+PSBuY29sKE1EMTkyNC4xOTI0WyxNRDE5MjQuMTkyNCA9PSAzMV0pIC0gcCwiTm8iIF0pICAKCgojbGlzdCBvZiBzdHVkZW50IG1lZXRzIGxlYXJuaW5nIG91dGNvbWUgMzEgcmVzdWx0IHJlcXVpcmVtZW50CkxPMzFTVkxpc3QKbmEub21pdChhcy5kYXRhLmZyYW1lKExPMzFTVkxpc3QpKQoKCgojTGVhcm5pbmcgb3V0Y29tZSAyMyBoYW5kbGluZyBleGNlcHRpb24gZGF0YSBvZiBtaWR0ZXJtIE1EMTkyMgojTGVhcm5pbmcgb3V0Y29tZSAyMyBvbmx5IGhhdmUgMSBxdWVzdGlvbiBpbiBtaWR0ZXJtIChNRDE5MjIpIGFuZCAyIGluIGZpbmFsClRvdGFsUUZyYW1lR0tFWAojbWFqb3JpdHkgb2Ygc3R1ZGVudHMgaGF2ZSByaWdodCBhbnN3ZXIgZm9yIExvMjNNRDE5MjIgbWlkdGVybQpEaWVtR0suMTkyMi5MTzIzCiNObyBzdHVkZW50IGhhdmUgMyByaWdodCBhbnN3ZXIgZm9yIHRvdGFsIExlYXJuaW5nIG91dGNvbWUgMjMobWlkL2ZpbmFsKS4KTE9XMjMKYGBgCgpgYGB7cn0KIyBDYXUgVkkuMwojIElESwojIApHS01OPC0gRGllbUdLQ0suMlssYygzLDU6MjkpXQpOaG9tMTwtR0tNTltHS01OWywxXSA9PSAiTDAxIixdCk5ob20yPC1HS01OW0dLTU5bLDFdID09ICJMMDIiLF0KTmhvbTM8LUdLTU5bR0tNTlssMV0gPT0gIkwwMyIsXQpOaG9tMSRUb25nRGllbSA8LXJvdW5kKHJvd1N1bXMoYXBwbHkoTmhvbTFbLGMoMjoyNildLDIsYXMubnVtZXJpYykpLzI1KjEwLDEpCiNhdmVyYWdlIG9mIGVhY2ggTmhvbQptZWFuKHJvdW5kKHJvd1N1bXMoYXBwbHkoTmhvbTFbLGMoMjoyNildLDIsYXMubnVtZXJpYykpLzI1KjEwLDEpKQptZWFuKHJvdW5kKHJvd1N1bXMoYXBwbHkoTmhvbTJbLGMoMjoyNildLDIsYXMubnVtZXJpYykpLzI1KjEwLDEpKQptZWFuKHJvdW5kKHJvd1N1bXMoYXBwbHkoTmhvbTNbLGMoMjoyNildLDIsYXMubnVtZXJpYykpLzI1KjEwLDEpKQojbWVkaWFuIG9mIGVhY2ggTmhvbQptZWRpYW4ocm91bmQocm93U3VtcyhhcHBseShOaG9tMVssYygyOjI2KV0sMixhcy5udW1lcmljKSkvMjUqMTAsMSkpCm1lZGlhbihyb3VuZChyb3dTdW1zKGFwcGx5KE5ob20yWyxjKDI6MjYpXSwyLGFzLm51bWVyaWMpKS8yNSoxMCwxKSkKbWVkaWFuKHJvdW5kKHJvd1N1bXMoYXBwbHkoTmhvbTNbLGMoMjoyNildLDIsYXMubnVtZXJpYykpLzI1KjEwLDEpKQoKI0ZyZXF1ZW5jeSBvZiBlYWNoIE5ob20gYWNjb3JkaW5nIHRvIERpZW0KCkZOaG9tMSA8LWFzLmRhdGEuZnJhbWUodGFibGUocm91bmQocm93U3VtcyhhcHBseShOaG9tMVssYygyOjI2KV0sMixhcy5udW1lcmljKSkvMjUqMTAsMSkpKQpjb2xuYW1lcyhGTmhvbTEpIDwtIGMoIkRpZW0iLCAiUGVyY2VudGFnZSIpCkZOaG9tMSRQZXJjZW50YWdlIDwtIHJvdW5kKEZOaG9tMSRQZXJjZW50YWdlL3N1bShGTmhvbTEkUGVyY2VudGFnZSkqMTAwLDIpCgpGTmhvbTIgPC1hcy5kYXRhLmZyYW1lKHRhYmxlKHJvdW5kKHJvd1N1bXMoYXBwbHkoTmhvbTJbLGMoMjoyNildLDIsYXMubnVtZXJpYykpLzI1KjEwLDEpKSkKY29sbmFtZXMoRk5ob20yKSA8LSBjKCJEaWVtIiwgIlBlcmNlbnRhZ2UiKQpGTmhvbTIkUGVyY2VudGFnZSA8LSByb3VuZChGTmhvbTIkUGVyY2VudGFnZS9zdW0oRk5ob20yJFBlcmNlbnRhZ2UpKjEwMCwyKQoKRk5ob20zIDwtYXMuZGF0YS5mcmFtZSh0YWJsZShyb3VuZChyb3dTdW1zKGFwcGx5KE5ob20zWyxjKDI6MjYpXSwyLGFzLm51bWVyaWMpKS8yNSoxMCwxKSkpCmNvbG5hbWVzKEZOaG9tMykgPC0gYygiRGllbSIsICJQZXJjZW50YWdlIikKRk5ob20zJFBlcmNlbnRhZ2UgPC0gcm91bmQoRk5ob20zJFBlcmNlbnRhZ2Uvc3VtKEZOaG9tMyRQZXJjZW50YWdlKSoxMDAsMikKCkdOaG9tMSA8LSBnZ3Bsb3QoRk5ob20xLCBhZXMoeCA9IGFzLmNoYXJhY3RlcihGTmhvbTFbLDFdKSwgeSA9IEZOaG9tMVssMl0pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdlb21fdGV4dChhZXMobGFiZWw9Rk5ob20xWywyXSksIHZqdXN0PS0wLjMsIHNpemU9My41LCApKwogIGxhYnModGl0bGUgPSAiTmhvbSAxIiwgeCA9ICJEaWVtIiwgeSA9ICIlU1YgY3VhIG5ob20iKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjZDU1N2Q1IikpCgpHTmhvbTIgPC0gZ2dwbG90KEZOaG9tMiwgYWVzKHggPSBhcy5jaGFyYWN0ZXIoRk5ob20yWywxXSksIHkgPSBGTmhvbTJbLDJdKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUZOaG9tMlssMl0pLCB2anVzdD0tMC4zLCBzaXplPTMuNSwgKSsKICBsYWJzKHRpdGxlID0gIk5ob20gMiIsIHggPSAiRGllbSIsIHkgPSAiJVNWIGN1YSBuaG9tIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI2Q1NTdkNSIpKQoKR05ob20zIDwtIGdncGxvdChGTmhvbTMsIGFlcyh4ID0gYXMuY2hhcmFjdGVyKEZOaG9tM1ssMV0pLCB5ID0gRk5ob20zWywyXSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1GTmhvbTNbLDJdKSwgdmp1c3Q9LTAuMywgc2l6ZT0zLjUsICkrCiAgbGFicyh0aXRsZSA9ICJOaG9tIDMiLCB4ID0gIkRpZW0iLCB5ID0gIiVTViBjdWEgbmhvbSIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNkNTU3ZDUiKSkKCkdOaG9tIDwtIGdnYXJyYW5nZShHTmhvbTEsR05ob20yLEdOaG9tMywgbmNvbCA9IDMpCgpHTmhvbQoKI2NvbmNsdXNpb246IAojTmhvbTMgaGFzIGhpZ2ggZ3JhZGUgd2l0aCBoaWdoZXN0IGF2ZXJhZ2UgZ3JhZGUKI05ob20xIGhhcyBsb3cgZ3JhZGUgd2l0aCBsb3dlc3QgYXZlcmFnZSBncmFkZQojTmhvbTIgaGFzIGF2ZXJhZ2UgZ3JhZGUgc2xpZ2h0bHkgbG93ZXIgdGhhbiBOaG9tMwpgYGAKCg==